实体框架4.1每个类型的映射表

时间:2011-04-05 23:24:20

标签: entity-framework code-first table-per-type

我正在尝试使用代码优先方法编写项目,我遇到了以下问题

    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”也有一个价格字段。

我是否必须明确忽略该字段?

有什么建议吗?

3 个答案:

答案 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 !!!