2017-03-09 183 views
2

我有兩個類:實體框架許多一對多帶附加列

public class Address 
{ 
    public Guid Id { get; set; } 

    public virtual ICollection<ToAddressMessageLink> MessagesTo { get; set; } 
    public virtual ICollection<CopyAddressMessageLink> MessagesCopyTo { get; set; } 
} 

public class Message 
{ 
    public Guid Id { get; set; } 

    public virtual ICollection<ToAddressMessageLink> To { get; set; } 
    public virtual ICollection<CopyAddressMessageLink> CopyTo { get; set; } 
} 

,我需要保存在表它們之間的連接。 如果我只是簡單地把多對多關係放在一起,那麼Ef就不會意識到實際設置了什麼類型的連接(表格行將與它們相同)。 所以我要創建一個鑑別的鏈接類似以下內容:

public class AddressMessageLink 
{ 
    public int LinkType { get; set; } 
    public Guid AddressId { get; set; } 
    public Guid MessageId { get; set; } 
} 

但它也犯規wokr因爲我不能設置鏈接類型/ 所以我要在這裏使用TPH:

public abstract class AddressMessageLink 
    { 
     public int LinkType { get; set; } 
     public Guid AddressId { get; set; } 
     public Guid MessageId { get; set; } 
    } 

    public class CopyAddressMessageLink : AddressMessageLink 
    { 
     public virtual AddressDto Address { get; set; } 
     public virtual MessageDto Message { get; set; } 
    } 

    public class ToAddressMessageLink : AddressMessageLink 
    { 
     public virtual AddressDto Address { get; set; } 
     public virtual MessageDto Message { get; set; } 
    } 

隨着複合鍵

HasKey(x=>new {x.AddressId, x.MessageId, x.LinkType}); 

但它不擦出火花,因爲EF:對類型TOADD「國外關鍵部件AddressId未聲明的屬性ressMessageLink」。

如果我把AddressId和MessageId放到派生類中,我不能設置鍵值,因爲在基類中沒有它的組件。

我該怎麼做這種情況?

回答

1

如果你有類,你想連接,你需要創建一個類,將連接你的兩個表。你在那裏:

public class AddressMessageLink 
{ 
    public int LinkType { get; set; } 
    public Guid AddressId { get; set; } 
    public Guid MessageId { get; set; } 
} 

但是你不加入虛擬屬性。所以你必須這樣做。

在你的表定義:

public class Address 
{ 
    public Guid Id { get; set; } 

    public virtual ICollection<AddressMessageLink> AddressMessageLink { get; set; } 
} 

public class Message 
{ 
    public Guid Id { get; set; } 

    public virtual ICollection<AddressMessageLink> AddressMessageLink { get; set; } 
} 

而且在AddressMessageLink對象:

public class AddressMessageLink 
{ 
    public int LinkType { get; set; } 
    public Guid AddressId { get; set; } 
    public Guid MessageId { get; set; } 

    public virtual Address Address { get; set; } 
    public virtual Message Message { get; set; } 
} 

將連接你的表是多對多。

+0

它會在這種情況下工作,但如果我添加ICollection 類型的另一個屬性,它會導致「關係Address_MessagesTo」未加載,因爲類型不可用「 –

+0

告訴我,你想要什麼那麼,這種類型的另一個屬性呢? 您只能在一個對象中定義此類型的一個屬性。 –

+0

'(公共類地址 { 公共的Guid ID爲{得到;集;} 公共虛擬的ICollection MessageTo {得到;集;} 公共虛擬的ICollection MessageCopyTo {得到;集;} } 公共類消息 { 公共的Guid ID爲{得到;集;} 公共虛擬的ICollection 地址{得到;集;} public虛擬的ICollection CopyToAddress {得到;集;}} )' –