我正在尝试使用代码优先方法编写项目,我遇到了以下问题
public class BaseType
{
[Key]
public int id { get; set; }
public string description { get; set; }
}
public class Type1 : BaseType
{
public decimal price { get; set; }
}
public class mycontext : DbContext
{
public DbSet<BaseType> basetypes { get; set; }
public DbSet<Type1> type1 { get; set; }
}
当我运行应用程序并创建一个对象Type1并使用mycontext.type1.ADD(mytype1object);
时,我查看数据库,类型1的表具有正确的字段,但父表“basetypes”也有一个价格字段。
我是否必须明确忽略该字段?
有什么建议吗?
答案 0 :(得分:1)
默认情况下,代码首先使用TPH(Table Per Hierarchy)继承。这意味着两个类型都存储在一个名为“BaseTypes”的表中。你会注意到它还包括一个名为'Discriminator'的额外字段。 EF将在该字段中存储一个值,以指定每条记录的类型。
如果您希望您的类型位于不同的表中,则需要为TPT(每种类型的表)设置上下文。您可以使用带有表名的Data Annotation来装饰类,也可以使用模型绑定器。下面是数据注释方式。
[Table("BaseTypes")]
public class BaseType
{
[Key]
public int id { get; set; }
public string description { get; set; }
}
[Table("Type1s")]
public class Type1 : BaseType
{
public decimal price { get; set; }
}
答案 1 :(得分:0)
我无法重现您的问题 - 事实上,如果我在EF 4.1中使用相同的模型,那么生成 的数据库会有BaseTypes
表,其中包含BaseType
的两个元素
和Type1
- 具有BaseType
元素的行只有一个空值作为价格。所以你现在不使用TPT而是使用TPH。要切换到TPT,您可以为您的班级Type1
添加注释或使用流畅的API:
[Table("Type1s")]
public class Type1 : BaseType
{
public decimal price { get; set; }
}
答案 2 :(得分:0)
感谢您输入BrokenGlass和ckal。我正在使用“Table(Name)”注释和流畅的API,我按照所有步骤操作,最后我得到一个BaseTypes和Type1s的表,BaseTypes表包含Type1s中字段的字段。
然而,在我继续为我的模型中的每个剩余类创建表名后,我尝试了所有工作。
我不确定这是不是侥幸,或者我发现了一个错误,但现在一切正常。
再次感谢您的快速回复。
Sanity Restored .... For Now !!!