2016-02-01 56 views
0

我有兩個表是通過一對一的關係。主表消息如何在EF中的兩個表之間創建兩個一對一的關係?

public class Message 
{ 
    [Key] 
    public Guid Id {get; set;} 
    //Other fields 
    public virtual MessageContent MessageContent {get;set;} 
} 

和相關表格在messageContent

public class MessageContent 
{ 
    [Key] 
    [ForeignKey] 
    public Guid MessageId {get; set;} 
    //Other fields 
    public virtual Message Message {get;set;} 
} 

它運作良好。但是,我需要從在messageContent增加兩個關係,一個到零至消息

public class MessageContent 
{ 
    [Key] 
    [ForeignKey] 
    public Guid MessageId {get; set;} 
    //Other fields 
    public virtual Message Message {get;set;} 

    public virtual Message Reason {get;set;} 
    public Guid? ReasonId {get;set;} 

    public virtual Message Report {get;set;} 
    public Guid? ReportId {get;set;} 
} 

拋出異常。如何將兩個關係從相關表格添加到主表格一對零?

+2

什麼是拋出異常?這是代碼優先嗎? –

+0

是的,它的代碼優先。如果使用下面答案中描述的DataAnnotation方式,則會引發異常:無法確定依賴操作的有效排序。由於外鍵約束,模型要求或商店生成的值,可能會存在依存關係。 –

回答

1

你不是ReasonReport指定foreignkeys現在。你需要改變你的MessageContent這樣的:

public class MessageContent 
{ 
[Key] 
[ForeignKey("Message")] 
public Guid MessageId {get; set;} 
//Other fields 
public virtual Message Message {get;set;} 

[ForeignKey("Reason")] 
public Guid? ReasonId {get;set;} 
public virtual Message Reason {get;set;} 

[ForeignKey("Report")] 
public Guid? ReportId {get;set;} 
public virtual Message Report {get;set;} 
} 

或者您也可以通過流暢API做到這一點:

modelBuilder.Entity<MessageContent>() 
      .HasOptional(m => m.Reason) 
      .WithRequired(r => r.MessageContent) 
      .HasForeignKey("ReportId"); 

編輯:你得到的錯誤是因爲你有一個圓形請參閱MessageMessageContent。最簡單的方法是將MessageId設爲MessageContent,併爲MessageContent創建另一個主鍵。這會讓你的關係變得可選。第二種解決方案是以流利的方式告訴EF哪個模型是主體,哪個是依賴實體。現在,MessageContentMessage都被視爲主體,因此當您撥打SaveChanges()時,EF不知道哪一個先插入/更新。

+0

如果使用DataAnnotation,則會引發異常:無法確定依賴操作的有效排序。由於外鍵約束,模型要求或商店生成的值,可能會存在依存關係。 –

+0

調用SaveChanges方法時引發的異常 –

+0

如果使用Fluent API - 編譯器錯誤CS1061:ForeignKeyNavigationPropertyConfiguration不包含HasPrimaryKey的定義並且沒有擴展方法HasPrimaryKey接受ForeignKeyNavigationPropertyConfiguration類型的第一個參數可以找到(您是否缺少使用指令或程序集引用?)。 –

0

您沒有像使用MessageId一樣使用ForeignKey屬性註釋ReasonId和ReportId參數。你有沒有試過指定這個屬性?

一般來說,您在這裏依賴於「最小配置」,EF確定例如MessageId鍵與Message屬性而不是Reason屬性關聯。雖然這可以起作用,但它可能難以檢測什麼時候出現問題或者何時通過了EF可以推斷的內容。

通常,更明確可以提供幫助。例如:

  • 填寫的構造函數的參數上ForeignKey的
  • 用流利的配置完全指定屬性,如G。

    builder.Entity().HasOptional(mc => mc.Reason) 
     .WithMany() 
     .HasForeignKey(mc => mc.ReasonId); 
相關問題