2015-09-29 60 views
0

嗨,朋友,我是新的實體框架。 我正在使用實體框架代碼的第一種方法。 我創建了一個自連接表。如何防止在實體框架代碼中的這種衝突第一

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

     [Required, MaxLength(20),Index(IsUnique = true)] 
     public string Name { get; set; } 

     public int? Parent { get; set; } 

     [ForeignKey("Parent")] 
     public virtual A FkA{ get; set; } 

     [ForeignKey("Parent")] 
     public virtual ICollection<A> FkAl{ get; set; } 
    } 

現在它創建表沒有問題,我能夠插入數據。 但問題在於。

想我插入3行像

Name1 with NULL Parent 
    Name2 with Name1 Parent 
    Name3 with Name2 Parent 

它讓我以這種方式插入,這就是精細

,但如果我這樣喜歡更新此。

Name1 with Name3 Parent 
    Name2 with Name1 Parent 
    Name3 with Name1 Parent 

它給我沒有錯誤。但是你可以看到Name1和Name3都在彼此之內。

COS這是一個自聯接表什麼是檢查權層次的最佳途徑。

像高不能降低去

請幫我在這。

我嘗試了很多事情,並得到了與上ICollection的應用foreach循環,這讓我檢查這個,但我認爲它花了大量的時間去層次的瓢的方式。所以請爲我提供最好的方法來做到這一點。

感謝

+0

你的更新意味着'Name3'是'Name1'的父親,'Name1'也是'Name3'的父親?奇怪的。 – Hopeless

+0

@Hopeless是的,這不應該發生 –

+0

以防止這種情況,有2種情況:首先當爲某個'A'設置父項時,確保它不是'A'的任何子項。第二,當爲某個「A」添加子項時,請確保它不是「A」的父項。你當然需要手動做到這一點。您還需要遞歸檢查,以及我可以想象它是多麼密集。 – Hopeless

回答

0

只有具有父子關係並不意味着表包含有效的表或表(森林)

你基本上是在尋找一種方式來實施有效的樹(或森林)結構在你的桌子上。

在EF,你能做的最好的事情可以說是你做了什麼。 但是,在sql server中,你可以做得更好,例如參見Hierrachical Data-Sql Server節:執行樹。 Essentialy,它結合了一個hierrchyid主鍵和一個計算,持久的父外鍵。

請檢查EF中的hierarchyid插件實現是否可以解決。

話雖這麼說,我可以猜測,你遇到的是一系列的,你要去面對的,因爲缺乏一個快速的方法來查詢一個層次感知的方式你的數據的問題之首。例如,讓我們說一個給定條目的所有祖先:你所能做的就是循環遍歷各個部分。

更糟糕:你如何獲得給定條目的所有後代?這一個將會變得更加複雜。

其實,如果你有一個快速的查詢找到一個條目的後代,你可以檢查,如果新的母公司是其中之一,一切都很好。

所以我的建議是,如果你有一個嚴重的層次,這是完全值得的一些HIERARCHYID列添加到表的努力。

+0

它閔有沒有簡單的方法來做到這一點? –

+1

對於快速修復而不是永久修復,我建議您在Sql server中實現一個函數,以在給定兩個條目時驗證數據的有效性。它應該確保第二個條目不是第​​一個條目的後代。它會比在EF中進行同樣的檢查快得多。這會給你一些時間來實施一種更清潔的方法。 – Alireza

+0

@Alirezaok讓我試試這個。 –

相關問題