2014-11-05 79 views
0

我在實體框架(6)中的代碼優先方法遇到問題。我實際上有一個數據庫,我試圖編寫將導致實體框架複製的代碼。到目前爲止我已經接近了,但並非100%。第一個問題是許多一對多的關係:EF 6 - TPC - 多對多關係

我有一個基類叫做消費和它只有基本屬性:

public abstract class Consumer 
{ 
    public Guid ID { get; set; } 
    [DataType(DataType.DateTime)] 
    public DateTime CreateDate { get; set; } 
    [DataType(DataType.DateTime)] 
    public DateTime? LastModDate { get; set; } 
    public int RecordStatus { get; set; } 
} 

然後我想用繼承的後續類:

public class Entity : Consumer 
{ 
    [DisplayName("Entity Name")] 
    public string EntityName { get; set; } 
    [DisplayName("Phone Number"] 
    public string PhoneNumber { get; set; } 
    [DisplayName("Doing Business As"] 
    public string DBA { get; set; } 
} 

在我的上下文類,我成功映射所有屬性表中的:

modelBuilder.Entity<Entity>().Map(m => 
    { 
     m.MapInheritedProperties(); 
     m.ToTable("Entity"); 
    }); 

我繼續這樣的設計與其他類(例如聯繫人):

public class Contact : Consumer 
{ 
    [DisplayName("First Name")] 
    public string FirstName { get; set; } 
    [DisplayName("Last Name"] 
    public string LastName { get; set; } 
} 

現在,很明顯,接觸可能與一個以上的實體和實體可能與一個以上的聯繫。我將如何編碼?我唯一能想到的事情是建立一個相關的類,像這樣:

public class RelatedContact 
{ 
    public Guid ID { get; set;} 
    public Guid ContactID { get; set; } 
    public virtual Contact Contact { get; set; } 
    public Consumer Parent { get; set; } 
    public virtual Consumer Parent { get; set; } 
    public Guid RelationshipTypeID { get; set; } 
    public virtual RelationshipType RelationshipType { get; set; } 
} 

然後創建相關的課後,我是假設我需要去更新我的實體類,像這樣:

public class Entity : Consumer 
{ 
    [DisplayName("Entity Name")] 
    public string EntityName { get; set; } 
    [DisplayName("Phone Number"] 
    public string PhoneNumber { get; set; } 
    [DisplayName("Doing Business As"] 
    public string DBA { get; set; } 
    public virtual ICollection<Contact> Contacts { get; set; } 
} 

然後,我會更新我的DbContext來映射許多關係,但我不知道正確的語法,或者如果這是解決此問題的正確方法。我試圖得到以下表格輸出:

<<Entity>> 
ID uniqueidentifier, 
CreateDate datetime, 
LastModDate datetime, 
RecordStatus int, 
EntityName varchar(250), 
PhoneNumber varchar(100), 
DBA varchar(250) 

<<Contact>> 
ID uniqueidentifier, 
CreateDate datetime, 
LastModDate datetime, 
RecordStatus int, 
FirstName varchar(100), 
LastName varchar(100) 

<<RelatedContact>> 
ID uniqueidentifier, 
ContactID uniqueidentifier, 
ParentID uniqueidentifier, 
RelationshipTypeID uniqueidentifier 

那麼,有什麼建議嗎?我是否至少朝着正確的方向前進?

回答

1

要創建多對多關係,您需要使用第二種方法。只需將導航集合添加到您的實體和聯繫人類。 EF將爲您創建鏈接表並跟蹤鏈接。

public class Entity : Consumer 
{ 
    ... your props 

    public virtual ICollection<Contact> Contacts { get; set; } 
} 

public class Contact : Consumer 
{ 
    ... your props 

    public virtual ICollection<Entity> Entities { get; set; } 
} 
+0

所以我們的目標是建立一個單一的RelatedContact表。我有其他的類對象,也有相關的聯繫人,並希望共享該表並使用基類Consumer作爲外鍵的「Parent」部分。那可能嗎? – Keith 2014-11-05 20:23:41

+0

回答你的問題「是可能的嗎?」 - 是的。但是從這種方法中你會得到什麼好處呢?如果爲每個關係添加額外的表,它不會對數據庫產生很大的影響。但是所有的行爲都將由EF管理。這將爲您節省大量的開發時間。 – Pavel 2014-11-05 20:31:51

+0

我需要一張表的原因是我試圖模仿一個現有的數據庫並創建一個概念證明,它可以證明,通過代碼和正確的模型,EF可以創建相同的表和關係。我相信我通過連接到我們現有的數據庫找到了我的解決方案,然後爲這些表創建一個EF數據模型,以查看VS2013會出現什麼,我可以在清理完成後添加自己的答案。感謝您的答覆。 – Keith 2014-11-05 20:38:17