2017-03-02 35 views
1

我有有1至1 .. *關係(這意味着總是會有的「狀態」表中的記錄特定ID兩個表流利的API,構建1:*關係

|Area|    |  Status  | 
------    ------------------- 
|[Key] ID | ----> |[Key]  ID  | 
|  Name|   |[Key] Start Date | 
         |  End Date | 

我有建在我的數據層的關係如下。

HasMany(s => s.Statuses) 
    .WithRequired() 
    .HasForeignKey(s => s.Id); 

狀態

HasRequired(a => a.Area) 
    .WithMany(s => s.Statuses) 
    .HasForeignKey(s => s.Id); 

我有一個通用的'AllIncluding'方法,我用它來收集關聯的數據。在調試器中,我可以查看查詢並複製/粘貼到我的Oracle數據庫並執行。它按我的預期工作,並返回適當的行數。
問題是,在調試器中執行後,我瀏覽記錄集並找到完全不同的一組數據(縮減集)。

我的想法是,這是因爲我有圖中描述的定義的鍵。我可以創建有關... the upper bound of the multiplicity of the Dependent Role must be '1'的錯誤,並通過修改狀態表上的鍵來修改調試器中返回的記錄集。 這似乎表明記錄關係試圖刪除狀態表中的重複項以創建聯接?我試圖在Oracle中通過執行group by trunc(start_date)或其他類似的查詢來重新創建此操作,但無法命中返回結果的確切行。
它只證實我懷疑Fluent API中定義的映射和關係必須是錯誤的,但我不確定如何正確表示這一點。

最終我只想在Fluent API中創建1 - > 1 .. *關係。

謝謝!

+0

這將有助於查看類定義。實際上'Status'似乎是'Area'和一些存儲「真實」狀態的狀態表之間的聯結類,否則多對多關係似乎更合適。但是很難從你的描述中拼湊出發生的事情。 –

回答

1

它只是證實了我的懷疑,在流利的API定義的映射和關係必須是錯的

  1. 映射用流利的API關係時要非常小心。特別是With使用的方法重載必須完全匹配存在/不存在導航屬性。 WithRequired().WithRequired(a => a.Statuses)完全不同。當你沒有導航屬性時使用前者,否則使用後者。在你的情況下,你錯誤地使用了無參數過載。

  2. 總是在一個地方配置關係。這種關係是一件涉及兩個實體的事情 - 不需要在兩個地方複製它,更重要的是,它很容易出錯。目前您有兩個定義,一個正確(對於Status)和一個不正確(對於Area)。最終結果是EF認爲它們是兩種不同的關係,這反過來導致不正確的結果。

所以,無論是從Area刪除代碼,並留下該代碼在Status的是:

HasRequired(s => s.Area) 
    .WithMany(a => a.Statuses) 
    .HasForeignKey(s => s.Id); 

Status刪除代碼,並使用在Area如下:

HasMany(a => a.Statuses) 
    .WithRequired(s => s.Area) 
    .HasForeignKey(s => s.Id); 
+0

我試圖從Area表中刪除關係,但是我開始收到一個錯誤,指出找不到Area_Id值。我知道這是由於關係沒有被定義,所以添加了.HasForeignKey()子句。 – McArthey

+0

我認爲你可能會做些什麼,因爲我改變了我的狀態表中的密鑰以包括其他人,並看到新的結果 – McArthey

+0

根據你所顯示的,表中必須沒有'Area_Id'列,因爲通過你的設置'Status.ID'應該是FK到'Area'。希望你在'Status'配置中使用了'HaskKey(s => new {s.Id. s.StartDate}''''''''''''''''''''! –