2011-04-05 73 views
0

我想使用的代碼,第一種方法寫一個項目,我遇到了以下問題實體框架4.1的table-per-類型映射

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);,我看數據庫的類型一表有正確的字段,但父表「basetypes」也有一個價格字段。

我是否必須明確忽略該字段?

有什麼建議嗎?

回答

1

默認情況下,代碼首先會使用TPH(Table Per Hierarchy)繼承。這意味着你的兩個類型都被存儲在一個名爲「BaseTypes」的表中。您會注意到它還包含一個名爲「Discriminator」的額外字段。 EF將在該字段中存儲一個值來指定每條記錄是哪種類型。

如果您希望自己的類型位於不同的表中,您需要爲TPT(Table Per Type)設置您的上下文。您可以使用表名稱來填充具有數據註釋的類,也可以使用模型聯編程序。以下是數據註解方式。

[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; } 

} 
0

我無法重現您的問題 - 事實上,如果我用EF 4.1系統產生BaseTypes表包含BaseTypeType1這兩個元素的DB同型號 - 與BaseType元素的行只要有一個空值作爲價格。所以你目前不使用TPT,而是使用TPH。要切換到TPT你可以註解你Type1類或使用流利的API:

[Table("Type1s")] 
public class Type1 : BaseType 
{ 
    public decimal price { get; set; } 

} 
0

感謝輸入BrokenGlass和ckal。我綁定用戶的「表(名稱)」註釋和流利的API,我遵循所有的步驟,我不斷結束了一個表的BaseTypes和Type1s和BaseTypes表包含字段Type1s中的字段。

但是,當我繼續爲模型中的其餘類中的每個類創建表名後,我嘗試了一切工作。

我不確定這是否是一種僥倖,或者如果我發現了一個錯誤,但現在一切正在工作。

再次感謝您的快速回復。

理智恢復....現在!