【问题标题】:MVC 5 Scaffolding with inheritance uses the wrong entity set具有继承的 MVC 5 脚手架使用错误的实体集
【发布时间】: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 模型和数据库上正常工作。

标签: asp.net-mvc entity-framework asp.net-mvc-5 dbcontext entity-framework-6.1


【解决方案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 时。

      【讨论】:

        猜你喜欢
        • 2011-09-10
        • 2014-04-09
        • 2016-02-05
        • 2013-05-17
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-08
        相关资源
        最近更新 更多