尝试添加MVC 4控制器时出错:';EntityClass';不是指定';ContextClass
本文关键字:EntityClass ContextClass MVC 添加 控制器 出错 | 更新日期: 2023-09-27 18:28:52
所以我正在使用Visual Studio 2012、MVC 4和Entity Framework 5.0进行一个实践项目。我使用"Basic"模板创建了一个MVC 4项目。我添加了一个简单的主页/索引控制器和视图,只是为了确保一切正常。是的。
我在models文件夹下为我的项目添加了一个edmx数据模型。(连接字符串经过测试且良好)。我从一个相当简单的SQL Express数据库生成了这个模型。以下是有关该模型的一些详细信息(替换通用名称):
模型edmx文件结构在Solution Explorer:中如下所示
[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控制器,具有读/写操作和视图,使用实体框架
- 模型类:EntityA(MyProject.Models)
- 数据上下文类:MyProjectEntitys(MyProject.Models)
- 视图:Razor(CSHTML)
然后我点击"添加"。我得到以下错误(再次,通用名称被替换):
"MyProject.Models.EntityA"不是指定的"MyProject.Models.MyProjectEntities"类的一部分,并且"MyProject_Models.MyProjectEntities"类无法修改为添加"DbSet<MyProject.Models.EntityA>'属性。(例如,"MyProject.Models.MyProjectEntities"类可能在已编译的程序集中。)
当我尝试将edmx放在自己的数据层项目中并从主项目中引用该项目时,我最初遇到了这个错误。要解决,
- 我试着把它移到主要项目上。运气不好
- 我尝试从头开始重新创建整个解决方案,并从一开始就在主项目中创建它。同样的错误
- 我阅读并尝试了这个问题/答案/评论中的几乎每一个解决方案或建议:实体框架MVC控制器没有成功
- 我尝试用分部类扩展MyProjectEntities,并添加包装器属性,以便强制它具有所需的"EntityA"属性,如下所示:
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会出现这种bug,并需要这种破解解决方案,请发表评论或添加另一个答案。它仍然让我有点困扰,我很想听到更多关于它的信息。