3

我處於這種情況,我有一個名爲Elements的表。現在我創建一個名爲Divergences的表,它將基本上存儲Elements對。 Divergence的目的是檢查兩個Elements是否有分歧的答案。實體框架將兩個表列映射到相同的相關表鍵

Element    Divergence 
---------    ---------- 
ElementId    ElementId1 
         ElementId2 

在上述表模式,ElementId1和​​是外鍵Elements表映射到ElementId和形成用於Divergence複合主鍵

我使用數據庫第一種方法其中我在SQL Server Management Studio中創建表,之後我在實體框架設計器中執行Update Model from Database...

我面臨的問題是,當EF設計師生成模型時,它會在Element類中創建2組ICollection<Element>,即ElementsElements1

enter image description here

這不會給我一個Divergences DbSet。

我想有什麼是Divergence類,我會做這樣的事情代碼:

Divergence d = new Divergence(); 
d.Element1 = element1; 
d.Element2 = element2; 

Database.Divergences.Add(d); 
Database.SaveChanges(); 

,稍後:

Element e = Database.Elements.Single(e => e.ElementId == 7); 

var divergences = e.Divergences; 

我嘗試添加一個新列到Divergence表如下:

Element    Divergence 
---------    ------------ 
ElementId    DivergenceId 
         ElementId1 
         ElementId2 

這正確地l在實體框架設計器中關聯到1 <-> *關係。我終於得到了一個Divergences DbSet,但DivergenceId屬性在代碼中沒用,我仍然在Element類中獲得2組屬性。需要注意的是,ElementId1和​​仍然構成複合主鍵。

您認爲映射這種特定情況的正確方法是什麼?感謝您的意見。

回答

2

而不是...

Divergence d = new Divergence(); 
d.Element1 = element1; 
d.Element2 = element2; 

Database.Divergences.Add(d); 
Database.SaveChanges(); 

...你可以實際使用:

element1.Elements = new List<Element>(); 
// if that collection isn't already instantiated, for example in the constructor 
element1.Elements.Add(element2); 

Database.SaveChanges(); 

這將創建一個完全相同的SQL語句INSERT到鏈接表,而不需要具有的Divergence實體。 (更改跟蹤將認識到您通過向集合中添加項目並根據此更改推斷出必需的SQL命令來更改關係。element1element2必須附加到狀態Unchanged的上下文中,但這也是您的原始代碼所需的爲了正確工作。)

此外,而不是...

Element e = Database.Elements.Single(e => e.ElementId == 7); 
var divergences = e.Divergences; 

...你可以從Divergences表中提取列像這樣:

var divergences = Database.Elements.Where(e => e.ElementId == 7) 
    .SelectMany(e1 => e1.Elements.Select(e2 => new 
    { 
     ElementId1 = e1.ElementId, 
     ElementId2 = e2.ElementId, 
    })) 
    .ToList(); 

所以,你會得到你想要的結果,而實體,並誠實地我會用這種方式。我沒有意識到強制EF使用數據庫優先方法創建該實體的方法,除非像您那樣引入一些人造附加列。如果有一種方式,它可能是一種黑客或更難以實現和維護,而不僅僅是使用EF的默認值,即沒有Divergence實體。

但是,您可以考慮刪除其中一個集合(只需在模型表面中將其刪除)。在我看來,這兩種模式在這個模型中有點混亂。或者至少將它們重命名爲SourceElementsTargetElements例如:)

+0

真棒Slauma!就是這樣......我將以這種方式實現它,因爲如你所說,沒有內置的功能來映射我想要的方式。非常感謝您的關注! :) –

相關問題