2010-09-14 115 views
2

我目前處於需要刪除實體而無法訪問關聯ObjectContext的情況。我讀了關於識別關係的信息,他們似乎正是我需要的:我想刪除一個對象,一旦它不再被它的「父對象」引用。實施與EF4的識別關係

我正在使用Visual Studio 2010 Premium從edmx文件生成我的數據庫。據我所知,我需要在我的「子」對象表的主鍵中包含我的「父」對象的外鍵。但是,我找不到一種方法告訴Visual Studio執行此操作。

有人能幫我解決這個問題嗎?我完全走錯路了,還是隻是在某個地方錯過了一個設置?

回答

2

我終於想通了:

轉到您的孩子的實體,並創建一個標量屬性的ParentId。將此屬性設置爲實體鍵(使其成爲主鍵,以及您的Child實體的Id屬性)。接下來轉到您的ParentChild關係並添加參考約束。約束的原則是你的父母和親屬是你的孩子。從屬財產必須是您剛剛在您的孩子上創建的財產(即ParentId)。保存一切,你很好去。

基本上,這是在這個博客中描述爲「方案2」:http://mocella.blogspot.com/2010/01/entity-framework-v4-object-graph.html

+0

我這樣做,然後得到錯誤3002「映射片段中的問題」,因爲實體模型中的主鍵不再反映DB中的主鍵。我必須從主鍵中刪除'ParentId'(並刪除關係的映射,因爲它與參考約束衝突) – Benjol 2013-09-11 08:22:59

+0

我的解決方案首先是針對模型的,因此它假定您從模型生成數據庫。我不知道它如何適用於現有的數據庫。您的解決方案是否仍保留識別關係的屬性? – Chris 2013-09-12 00:26:37

+0

好吧,它看起來像它:)我可以刪除通過簡單地做一個'parent.Remove(子)',它不會抱怨當我'SaveChanges' ... – Benjol 2013-09-12 04:35:49

0

不,你是在正確的道路上。你需要做的是在EDM設計器中創建你的2個實體(Parent and Child)後,右鍵單擊父實體並選擇Add => Association ...,然後指定Multiplicity和Navigation屬性名稱,然後單擊Ok。你會看到VS之間創建了一個關聯關係,當你從模型生成一個數據庫時,這將導致這兩個表之間的關係。
不是在你的Child實體上創建一個像ParentID一樣的屬性,因爲一旦你創建了關聯,設計器會自動創建它。
此外,您可以右鍵單擊EDM設計器中的關聯並選擇屬性,然後在「End2 OnDelete」選項上選擇「Cascade」選項,以便刪除父項時子項將被刪除。

+0

,只有當我刪除父對象的工作。我無法刪除子項(沒有對象上下文),我不能刪除父項(仍然需要)。我所能做的就是消除關係,當我這樣做時,它不會刪除孩子。級聯刪除僅適用於實際刪除父對象;當我刪除關係時,它不會刪除孩子。使用你的解決方案給了我一個錯誤信息:「來自'ParentChild'AssociationSet的關係處於'Deleted'狀態。給定多重約束,相應的'Child'也必須處於'Deleted'狀態。 – Chris 2010-09-15 07:06:52