假设我有一个像这样的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'。”}
答案 0 :(得分:1)
在实体框架代码中,每个层次结构的第一个表(TPH)是默认映射。
这意味着EF会将DbTest和DbEFF映射到同一个表。它还将添加一个名为Discriminator的列,以查看存储在特定行中保留的对象类型(DbTest或DbEFF)。
从错误中你可以看到你的数据库已经存在并且在你添加'someotherproperty'之前已经创建了它。即你的桌子上没有“其他属性”列。
要解决此问题,有几个选项,您需要获取表的架构以匹配您的类,或者您必须选择不同的映射策略。
最简单的解决方法是简单地删除数据库,让EF为您创建正确的数据库。