Ошибка при попытке добавить контроллер MVC 4: EntityClass не является частью указанного класса ContextClass

1

Поэтому я работаю над практическим проектом с использованием 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

Поэтому я перестрою свое решение, затем щелкните правой кнопкой мыши папку "Контроллеры" и выберите "Добавить" → "Контроллер" и выберите следующие параметры:

  • Имя контроллера: "EntityAsController".
  • Варианты лесов:
    • Шаблон: MVC-контроллер с действиями и представлениями чтения/записи, используя Entity Framework
    • Класс модели: EntityA (MyProject.Models)
    • Класс контекста данных: MyProjectEntities (MyProject.Models)
    • Просмотры: Razor (CSHTML)

Затем я нажимаю "Добавить". Я получаю следующую ошибку (опять же, заменяемые имена):

"MyProject.Models.EntityA" не является частью указанного класса "MyProject.Models.MyProjectEntities", а класс "MyProject.Models.MyProjectEntities" не может быть изменен, чтобы добавить свойство "DbSet <MyProject.Models.EntityA>" к нему. (Например, класс "MyProject.Models.MyProjectEntities" может находиться в скомпилированной сборке.)

Первоначально я получил эту ошибку, когда попытался разместить edmx в собственном проекте уровня данных и ссылаться на этот проект из основного проекта. Решать,

  • Я попытался переместить его в основной проект. Не повезло.
  • Я попытался воссоздать все решение с нуля и создать его в основном проекте с самого начала. Такая же ошибка.
  • Я читал и пробовал обезболивать практически со всеми решениями или предложениями в этом вопросе/ответах/комментариях (комментариях): Entity Framework MVC Controller не имеет успеха.
  • Я попытался расширить MyProjectEntities с частичным классом и добавить свойство оболочки для того, чтобы заставить его иметь требуемое свойство EntityA, например:

public DbSet<EntityA> EntityA { get { return this.EntityAs; } set { this.EntityAs = value; } }

Все, что было сделано, дало мне еще более бесполезную ошибку:

Возникла ошибка, генерирующая "MyProject.Models.MyProjectEntities". Попробуйте перестроить свой проект.

  • Я попытался восстановить проект. Такая же ошибка.

Кто-нибудь знает, что происходит?

Теги:
entity-framework
asp.net-mvc
asp.net-mvc-4

1 ответ

1
Лучший ответ

Я нашел решение своей проблемы. Это немного хаки, но это работает.

Первое сообщение об ошибке, описанное выше, жалуется на то, что "... класс не может быть изменен, чтобы добавить к нему свойство" 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 ведут себя в этом баггическом режиме и требуют этого хакерского решения, прокомментируйте или добавьте еще один ответ. Меня это немного беспокоит, и я бы хотел больше узнать об этом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню