Поэтому я работаю над практическим проектом с использованием Visual Studio 2012, MVC 4 и Entity Framework 5.0. Я создаю проект MVC 4 с использованием шаблона "Basic". Я добавляю простой контроллер Home/Index и просматриваю только, чтобы убедиться, что все работает. Это.
Я добавляю модель данных edmx в свой проект под папкой моделей. (Строки подключения проверены и хороши). Я генерирую эту модель из довольно простой базы данных SQL Express. Вот некоторые подробности о модели (заменены обобщенные имена):
Структура файла edmx в обозревателе решений выглядит следующим образом:
[edmxFile] MyProjectModel.edmx
[SubFile] MyProjectModel.Context.cs
[Class] MyProjectEntities
[Method] MyProjectEntities()
[Method] OnModelCreating()
[Property] EntityAs: DbSet<EntityA>
[Property] EntityBs: DbSet<EntityB>
[Property] EntityCs: DbSet<EntityC>
etc...
[SubFile] MyProjectModel.Designer.cs
[SubFile] MyProjectModel.edmx.diagram
[SubFile] MyProjectModel.tt
[ClassFile] EntityA.cs
[ClassFile] EntityB.cs
[ClassFile] EntityC.cs
etc...
[ClassFile] MyProjectModel.cs
Поэтому я перестрою свое решение, затем щелкните правой кнопкой мыши папку "Контроллеры" и выберите "Добавить" → "Контроллер" и выберите следующие параметры:
Затем я нажимаю "Добавить". Я получаю следующую ошибку (опять же, заменяемые имена):
"MyProject.Models.EntityA" не является частью указанного класса "MyProject.Models.MyProjectEntities", а класс "MyProject.Models.MyProjectEntities" не может быть изменен, чтобы добавить свойство "DbSet <MyProject.Models.EntityA>" к нему. (Например, класс "MyProject.Models.MyProjectEntities" может находиться в скомпилированной сборке.)
Первоначально я получил эту ошибку, когда попытался разместить edmx в собственном проекте уровня данных и ссылаться на этот проект из основного проекта. Решать,
public DbSet<EntityA> EntityA { get { return this.EntityAs; } set { this.EntityAs = value; } }
Все, что было сделано, дало мне еще более бесполезную ошибку:
Возникла ошибка, генерирующая "MyProject.Models.MyProjectEntities". Попробуйте перестроить свой проект.
Кто-нибудь знает, что происходит?
Я нашел решение своей проблемы. Это немного хаки, но это работает.
Первое сообщение об ошибке, описанное выше, жалуется на то, что "... класс не может быть изменен, чтобы добавить к нему свойство" DbSet <MyProject.Models.EntityA> "...". Поэтому я оставил свой неполный класс для того, чтобы распространять MyProject.Models.MyProjectEntities
пустым, например:
public partial class MyProjectEntities : DbContext
{
}
Теперь, когда я создаю контроллер, MVC, конечно, все еще глупо, чтобы увидеть, что автоматически созданные MyProjectEntities
уже содержат свойство, которое он хочет, но теперь у него есть файл для этого класса, который он может изменить, чтобы добавить дублирующее объявление этого свойства, изменяя мой код, чтобы выглядеть так:
public partial class MyProjectEntities : DbContext
{
public DbSet<EntityA> EntityAs { get; set; }
}
Он счастлив и делает мой контроллер и взгляды для меня. Теперь я просто вручную удаляю то, что он добавил в мой код, так что во время сборки нет ошибки неоднозначности. Я создаю проект, запускаю его, запускаю свой браузер и перехожу к "[siteUrl]/EntityAs" и TADA! Оно работает!
Надеюсь, это поможет кому-то, у кого есть эта проблема. Если кто-нибудь знает, почему MVC 4 и VS 2012 ведут себя в этом баггическом режиме и требуют этого хакерского решения, прокомментируйте или добавьте еще один ответ. Меня это немного беспокоит, и я бы хотел больше узнать об этом.