2013-11-20 141 views
0

愚蠢問題的時間。我認爲數據庫設計是棘手的,但我對這部分內容沒有多少能力。我在數據庫「Table1」中有一個表,然後是「Table2」,它實際上是Table1的擴展(我也有Table3,Table4等)。我的問題是Table2有它自己的唯一鍵,即使它是一對一的關係。然後Table2Component使用Table2Id作爲外鍵。但是,當我嘗試在我的代碼中使用它時,我認爲它指向Table1Id。我得到的錯誤信息:帶有密鑰的EF抽象基類,派生類具有不同的密鑰

System.Data.Entity.Edm.EdmAssociationConstraint:該類型的引用約束的從屬角色所有屬性必須是相同的主體作用相應的屬性類型。實體「Table2Component」上的屬性「Table2Id」的類型與參照約束「Table2Component_Table2」中實體「Table2」上的屬性「Table1Id」的類型不匹配。

下面是代碼

[Table("Table1")] 
public abstract class Table1 
{ 
    [Key] 
    [Column("table1_id")] 
    public string Table1Id { get; set; } 

    [Column("name")] 
    public string Name { get; set; } 

    [Column("type_cd")] 
    public string TypeCode { get; set; } 
} 

[Table("Table2")] 
public class Table2 : Table1 
{ 
    [Key] 
    [Column("table2_id")] 
    public int Table2Id { get; set; } 

    [ForeignKey("Table1Id")] 
    public virtual Table1 Table1 { get; set; } 

    // this table also has a table1_id column 
    // but I guess I don't need it here, correct? 

    [Column("column1")] 
    public string Column1 { get; set; } 

    public virtual ICollection<Table2Component> Table2Components { get; set; } 
} 

[Table("Table2Component")] 
public class Table2Component : ISubItem 
{ 
    [Key] 
    [Column("table2_component_id")] 
    public int Table2ComponentId { get; set; } 

    [Column("table2_id")] 
    public int Table2Id { get; set; } 

    [Column("description")] 
    public string Description { get; set; } 

    public bool Required { get { return true; } } 

    [ForeignKey("Table2Id")] 
    public virtual Table2 Table2 { get; set; } 
} 

有什麼建議?我應該更努力地試圖改變數據庫嗎?

+1

搜索'實體框架1:1關係'例如http://stackoverflow.com/a/14997417/1347784限制是兩個表必須有相同的外鍵使用1:1 –

+0

感謝您的幫助。一般來說,更好的數據庫設計是否將Table1的主鍵也作爲Table2的主鍵?然後我猜Table2Component將Table1Id作爲外鍵。 – nickfinity

+0

沒有不一定更好的數據庫設計。就是EF團隊爲什麼要構建這個框架。我學會了遵守這些限制。在代碼第一場景中,沒什麼大不了的。嘗試使用powertool來反向設計替代方法。 EF將使用1:M,即使您可能將其視爲1:1。我認爲還行。 –

回答

1

開始爲註釋....完成簡單的答案,因爲沒有人跳下去

搜索實體框架1:1的關係,例如https://stackoverflow.com/a/14997417/1347784的限制是當使用兩個表必須具有相同的外鍵1:1

沒有不一定更好的數據庫設計。這正是EF團隊爲什麼建立這個框架的原因。我學會了遵守這些限制。在代碼第一場景中,沒什麼大不了的。當您開始使用數據庫時,請嘗試使用powertool來反向設計替代方法。 EF將使用1:M,即使您可能將其視爲1:1。我認爲還行。

+0

感謝您的幫助。我想我會分享主鍵。這對我來說更有意義,並且會讓事情更輕鬆。 – nickfinity

相關問題