具有继承的 MVC 5 脚手架使用错误的实体集

Posted

技术标签:

【中文标题】具有继承的 MVC 5 脚手架使用错误的实体集【英文标题】:MVC 5 Scaffolding with inheritance uses the wrong entity set 【发布时间】:2014-09-24 09:17:28 【问题描述】:

在 MVC 5 和 EF 6.1 中,我使用了一个简单的继承层次结构,其中 Student 类从 Person 类继承。对于这两个类,我的数据库上下文中都有一个实体集(DbSet 属性):

public class DatabaseContext : DbContext

    public DbSet<Person> Persons  get; set; 
    public DbSet<Student> Students  get; set; 

现在,当我要求脚手架为子类 Student 生成一个控制器时,它使用 Persons 实体集,导致如下语句

    Student student = db.Persons.Find(id);

编译器显然抱怨它不能将任何人转换为学生。

有没有办法确保脚手架使用正确的实体集(本例中为学生)?

请注意,删除 Persons 实体集并不是一个好的解决方案,因为还有其他控制器需要这样做。

【问题讨论】:

你确定你的继承码是正确的? 嗯,我猜继承代码是正确的,因为EF PowerTools生成的图表正确显示了继承关系。 另一个观察结果:当我用 Student 替换所有出现的 Persons 时,生成的 Web 界面运行正常。此外,ASP.NET 动态数据(自动构建脚手架)在相同的 EF 模型和数据库上正常工作。 【参考方案1】:

使用查找和替换将父 DBSet 的 Controller 类中的所有匹配项更改为子 DBSet,例如将 Persons 更改为 Student。

你可能知道(我想你提出的)微软已经确认这是一个已知的错误http://connect.microsoft.com/VisualStudio/feedbackdetail/view/945937/mvc-5-scaffolding-with-inheritance-uses-the-wrong-entity-set,但他们不会修复它。

【讨论】:

【参考方案2】:

为什么不使用将 personID 作为外键的关系来代替继承?这就是为什么你可以 db.students.find(personID) 和 db.person.find(personID)

要查找所有详细信息? 额外的代码,但我想不出另一种方式

【讨论】:

【参考方案3】:

可以使用OfType命令,如图:

Student student = db.Persons.OfType<Student>().SingleOrDefault(s => s.id == id);

此命令适用于继承。在这种情况下,当 Student 继承自 Person 时。

【讨论】:

以上是关于具有继承的 MVC 5 脚手架使用错误的实体集的主要内容,如果未能解决你的问题,请参考以下文章

实体框架脚手架和迁移不起作用

如何更新脚手架生成的 MVC + 路由,用于在 Rails 中具有 2 个 belongs_to 关系的嵌套资源

运行脚手架控制器时出现 MVC 3 脚手架错误

ASP.NET MVC Core/6:EF 6 脚手架错误

为啥 MVC 脚手架会失败? (在 VS2012 和 VS2013 中有不同的错误)

带有现有存储库的 ASP.NET mvc 脚手架并将 POCO 映射到视图模型