尝试添加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"时出错。请尝试重新生成您的项目

  • 我试着重建这个项目。同样的错误

有人知道发生了什么事吗?

尝试添加MVC 4控制器时出错:';EntityClass';不是指定';ContextClass&#

我找到了自己问题的解决方案。这有点粗糙,但它有效。

上面的第一条错误消息抱怨"…无法修改类以向其添加'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,并需要这种破解解决方案,请发表评论或添加另一个答案。它仍然让我有点困扰,我很想听到更多关于它的信息。