继承自EFF db模型类会导致将派生类属性写入数据库

时间:2013-11-10 22:32:39

标签: c# asp.net-mvc entity-framework inheritance

假设我有一个像这样的EFF db模型:

public class DbEFF
    {   
        [Key]
        public long Id { get; set; }
    }

现在我正在创建一个类,我将继承db类,如下所示:

public class DbTest:DbEFF
{

    public DbTest(long id)
    {
      Id=id;
    }

  public string someotherproperty1 {get;set;}

}

现在我调用以下代码写入数据库:

var db = new DbEFF();
db.Id = "454545";

var model = new MasterEntities();
model.Table1.Add(db);
model.SaveChanges();

现在奇怪的是我得到一个内部异常,说列someotherproperty1不存在。我在这里错过了什么?为什么派生类的属性会像这样暴露?

我得到的例外是:

  

{“无效的列名'someotherproperty1'。”}

1 个答案:

答案 0 :(得分:1)

在实体框架代码中,每个层次结构的第一个表(TPH)是默认映射。

这意味着EF会将DbTest和DbEFF映射到同一个表。它还将添加一个名为Discriminator的列,以查看存储在特定行中保留的对象类型(DbTest或DbEFF)。

从错误中你可以看到你的数据库已经存在并且在你添加'someotherproperty'之前已经创建了它。即你的桌子上没有“其他属性”列。

要解决此问题,有几个选项,您需要获取表的架构以匹配您的类,或者您必须选择不同的映射策略。

最简单的解决方法是简单地删除数据库,让EF为您创建正确的数据库。