2013-10-25 31 views
0

我正在使用實體框架和流利的API來配置綁定。我的兩個實體是這樣的:如何配置兩個實體之間的1對1關係,其中一個是主體?

public class Matter 
{ 
    #region Properties 

    /// <summary> 
    /// Primary key 
    /// </summary> 
    public int Id { get; set; } 

    /// <summary> 
    /// Navigation: the most recent Relativity activity for the Matter 
    /// </summary> 
    public virtual RelativityActivity RelativityRecentActivity { get; set; } 

    #endregion 
} 

public class RelativityActivity 
{ 
    #region Properties 

    /// <summary> 
    /// Primary key 
    /// </summary> 
    public int Id { get; set; } 

    /// <summary> 
    /// Foreign key: the Matter that the Relativity Activity entry is associated with 
    /// </summary> 
    public Matter Matter { get; set; } 

    #endregion 
} 

我與現有的表架構的工作,並且在架構中RelativityActivity表只是有一個外鍵MatterId列。因此,Matter是關係中的主體,可以不存在RelativityActivity。但是,如果沒有Matter,則RelativityActivity不能存在。

對於我的生活,我似乎無法配置這個工作,因爲我期望。我已經閱讀了大量關於SO的答案,並且我在閱讀每個答案後調整了流暢的API綁定,但是我總是會看到從「無法確定主要關係端點」到「您用不正確的多重配置」 。

我現在一口流利的API綁定是這樣的:

modelBuilder.Entity<RelativityActivity>().HasRequired(m => m.Matter).WithRequiredDependent(m => m.RelativityRecentActivity).Map(m => m.MapKey("matter")).WillCascadeOnDelete(true); 

RelativityActivity和:

modelBuilder.Entity<Matter>().HasOptional(m => m.RelativityRecentActivity).WithRequired(m => m.Matter); 

Matter

我在關係中有兩個綁定,因爲沒有Matter綁定,我無法確定主要結束錯誤。但是現在我得到了一個關於多重性的錯誤。

編輯澄清:

外鍵列,在RelativityActivity表,是不是Id列。這實際上是另一列名爲matter。我嘗試在我的綁定中使用Map函數來指定它。

+0

是'RelativityActivity.Id'國外是否在關係中鍵入關鍵字,或者在RelativityActivity表中是否存在第二個字段,例如RelativityActivity.MatterId?這可能對答案很「重要」。 –

+0

不,外鍵列實際上是表中的另一列,名爲「問題」。在我的綁定中,我使用'Map'來指定。無論如何,這是我的意圖。 – Ryan

回答

1

數據庫模式只能強制執行0..1 - n關聯。一個1:1關聯總是涉及兩個相互引用的外鍵,或者一個主鍵同時是另一個主鍵的外鍵。

您還可以模擬一個1:1的關聯你的方式:

modelBuilder.Entity<Matter>().HasOptional(m => m.RelativityRecentActivity) 
          .WithRequired(m => m.Matter); 

的問題是,EF將假設數據庫架構還可以容納1:1的關聯。

如果你想節省MatterRelativityRecentActivity對象,EF將插入一個Matter記錄,並採取了PK值,用它作爲PK的RelativityRecentActivity(假設它也是一個FK)。所以在你的情況下,真正的外鍵字段永遠不會被填充。除此之外,如果RelativityRecentActivity具有自動遞增的PK(Sql Server中的標識列),它也可能引發異常。

所以我認爲你只能關聯模型作爲常規一對多關聯和使用業務規則來強制執行「多」是從來沒有超過1:

modelBuilder.Entity<Matter>().HasMany(m => m.RelativityRecentActivity) 
      .WithRequired(r => r.Matter) 
      .Map(m => m.MapKey("matter"); 
+0

因此,如果我能夠調整架構以使'RelaterActivity'的FK到'Matter'也成爲表的PK,那麼我的綁定邏輯對EF有效嗎? – Ryan

+0

當然,如果你可以改變模式,你可以使你的映射按你想要的方式工作。也許最簡單的方法是查看EF如何使用您選擇的映射創建數據庫並將其複製到現有數據庫中。 –

+0

謝謝。我認爲調整模式已經允許這個工作。無論是那種方式還是你的措辭!謝謝。 – Ryan

相關問題