1

Я следую за Pro ASP.NET MVC 4 от Адама Фримена на VS 2010 (я загрузил шаблон MVC 4 онлайн). Ранее я работал с файлом .edmx, но в главе 7 он этого не делает. Я устанавливаю базовую строку соединения с SQL Server в файле web.config в моем проекте WebUI, где расположены мои контроллеры и представления. Кроме того, я перечислил классы домена в моем проекте «Домен» ниже. Проблема возникает, когда я запускаю приложение. Приложение не распознает мою таблицу в моей базе данных (dbo.Request) и вместо этого создает таблицу на основе моего имени класса в пространстве имен Entities (поэтому она создает таблицу CustRequest), а также создает таблицу _Migration_History. Чтобы предотвратить это, я добавляю аннотацию данных выше моего класса [Таблица («MyTableName»)]. Я не мог понять, почему мне пришлось добавить эту аннотацию данных. Кроме того, EF заставил меня добавить [Key] выше моего первичного ключа, который я могу понять, потому что у меня нет свойства ID, но в книге он этого не делал. Мне было интересно, не хватает ли я чего-то очевидного, поскольку я довольно новичок в MVC. Любая помощь будет оценена по достоинству. Я работаю с EF 6. Спасибо.База данных MVC 4 и EF6 первая: проблема с сопоставлением

namespace Requestor.Domain.Entities 
    { 
     [Table("Request")] 
     public class CustRequest 
     { 
      [Key] 
      public int RequestId { get; set; } 
      public string RequestByUserCd { get; set; } 
      public DateTime RequestDateTime { get; set; } 
      public DateTime DueDate { get; set; } 
     } 
    } 

    namespace Requestor.Domain.Abstract 
    { 
     public interface ICustRequestRepository 
     { 
      IQueryable<CustRequest> Request { get; } 
     } 
    } 

    namespace ITRequestHub.Domain.Concrete 
    { 
     public class EFDbContext : DbContext 
     { 
      public DbSet<CustRequest> Request { get; set; } 
     } 
    } 


    namespace ITRequestHub.Domain.Concrete 
    { 
     public class EFCustRequestRepository : ICustRequestRepository 
     { 
      private EFDbContext context = new EFDbContext(); //retrieves the data 

      public IQueryable<CustRequest> Request 
      { 
       get { return context.Request; } 
      } 
     } 
    }  

ответ

0

Вы работать в удивительный и иногда расстраивает часть EF, его конвенций , Замечательно, когда вы знаете об условностях, поскольку они упрощают жизнь, но расстраивают, когда вы чувствуете, что фреймворк выполняет задачи без вашего явного разрешения.

Во-первых, дополнительная информация о конвенциях Ef6 можно найти здесь: http://msdn.microsoft.com/en-gb/data/jj679962.aspx

На вашем первом пункте, насколько мне известно, EF берет название вашей организации в качестве имени таблицы будет создавать в вашей БД. Как вы обнаружили, у вас есть контроль над этим с помощью атрибута «Таблицы», но вы также можете контролировать это желание хотеть множественное число ваших имен сущностей при создании таблиц пути удаления средства конвенции в вашем DbContext

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>() 

На ваш второй момент я не могу себе представить, что вам понадобится атрибут «Ключ», прикрепленный к вашему «RequestId». Соглашение состоит в том, что если имя поля содержит суффикс идентификатора (без учета регистра), тогда EF автоматически включит его в качестве первичного ключа, и если тип поля является либо Int, либо Guid, он будет автоматически установлен как столбец идентификации автозапуска.

+0

Таким образом, в книге он упоминает, что DbSet <> - это то, где происходит отображение. Имя свойства - это таблица, а тип DbSet - это класс для модели. Это изменилось с EF6 (теперь я читаю статью EF) –

+0

@JayMichael Я не думаю, что это когда-либо было так, что имя свойства DbSet сопоставлено с именем таблицы в вашей базе данных. Он всегда сопоставляется с именем класса сущности. См. Здесь: http://msdn.microsoft.com/en-gb/data/jj591583#TableColumn – ProxyTech

+0

, который, казалось, сделал этот трюк. Я добавил 'protected override void OnModelCreating (DbModelBuilder modelBuilder) {modelBuilder.Conventions.Remove (); Database.SetInitializer (null);} 'Я смог удалить DataAnnotations. Интересно, что вы сказали, может быть, я неправильно прочитал этот отрывок в книге. –

1

Рассмотрим снова пытается с EF5, если вы можете, я испытал подобные проблемы при попытке сделать Ef6 работу с MVC4 (я не мог»сделать строительные леса работу либо).

Или пройти весь путь до последних версий для всего и попробовать MVC5 с EF6 (это, кажется, работает нормально)