2014-02-18 173 views
0

從早期的帖子今天繼:配置多個1〜0..1關係

Entity framework one to zero or one relationship without navigation property

Understanding ForeignKey attribute in entity framework code first

我現在想配置以下關係:

Item1具有可選的RawData Item2具有可選的RawData Item3具有可選的RawData

RawData必須附加到Item1,Item2或Item3 - 它不會被期望獨立存在。

目前的結構是:

class ItemX 
{ 
    [Key] 
    public int Id { get; set; } 

    public int? RawDataId { get; set; } 
    [ForeignKey("RawDataId")] 
    public virtual RawData RawData { get; set; } 
} 

public class RawData 
{ 

    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    //other properties 
} 

我想這可能通過以下方式配置:

modelBuilder.Entity<Item1>().HasOptional(d => d.RawData).WithOptionalPrincipal().WillCascadeOnDelete(true); 
modelBuilder.Entity<Item2>().HasOptional(d => d.RawData).WithOptionalPrincipal().WillCascadeOnDelete(true); 
modelBuilder.Entity<Item3>().HasOptional(d => d.RawData).WithOptionalPrincipal().WillCascadeOnDelete(true); 

但是這給了以下錯誤:

The ForeignKeyAttribute on property 'RawData' on type 'Item1' is not valid. The foreign key name 'RawDataId' was not found on the dependent type 'RawData'.

這是相同的我今天在一篇較早的帖子中討論過的錯誤。在那個人中,我明白了由於共享主鍵而無法工作的原因。但是在這個例子中情況並非如此,因爲RawData不能與Item1共享主鍵,因爲Item2可能具有相同的ID。

感謝您的任何幫助。

編輯

我得到它的工作使用:

modelBuilder.Entity<Item1>().HasOptional(d => d.RawData).WithMany().HasForeignKey(d=>d.RawDataId).WillCascadeOnDelete(true); 
//etc. 

數據庫看起來確定。似乎有點奇怪被描述爲WithMany,但也許這是什麼時候需要什麼時候是多重關係?

回答

0

您需要包括項目1,項目2,項目3和在RawDataclass:

public class RawData 
{ 

    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public virtual Item1 i1 {get;set;} 
    public virtual Item2 i2 {get;set;} 
    public virtual Item3 i3 {get;set;} 
    //other properties 
} 
+0

我可以看到這是如何幫助定義關係,但它不應該是可能的,而不導航屬性? – Mark007

+0

似乎工作,如果我在流利的API中描述爲WithMany(),但這在原理上似乎是錯誤的.. – Mark007

+0

適應習慣有點奇怪,但嘗試它。它會工作。你甚至不需要流利的API中的任何代碼。 – pquest