具有继承的 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 关系的嵌套资源