2009-08-12 68 views
3

我需要在實體框架中重新進行級聯刪除,儘管搜索幾個小時並不接近解決方案。簡而言之,如果我有一個與子對象(MyObjectDetail)具有1-> 0..1關係的實體(MyObject),那麼我不能刪除MyObject而沒有更新的異常來抱怨約束 - 但僅限IF子MyObjectDetail未加載到內存中。刪除具有未加載的子實體的實體

System.Data.UpdateException: A relationship is being added or deleted from an AssociationSet 'FK_MyObjectDetail_MyObject'. With cardinality constraints, a corresponding 'MyObjectDetail' must also be added or deleted.

如果孩子(刪除之前爲MyObject即MyObject.MyObjectDetailReference.Load())調用,那麼它工作正常。

我的問題是,當然,我不希望(讀:不能)從MyObjectDetail加載varbinary字段,每次我想刪除父MyObject。這是可能的,還是我將不得不在一些手動SQL調用中進行破解以使其工作?

在SQL服務器:

MyObject [PK:Id<int>] -> MyObjectDetail [PK:MyObjectId<int>, Data<varbinary>]

的關係設置爲 「級聯」 的更新和刪除。

在EF設計者:

MyObject [1] -> [0..1] MyObjectDetail

在EF XML:

SSDL:

 
     <Association Name="FK_MyObjectDetail_MyObject"> 
      <End Role="MyObject" Type="MyEntities.Store.MyObject" Multiplicity="1"> 
      <OnDelete Action="Cascade" /> 
      </End> 
      <End Role="ObjectDetail" Type="MyEntities.Store.ObjectDetail" Multiplicity="0..1" /> 
      <ReferentialConstraint> 
      <Principal Role="MyObject"> 
       <PropertyRef Name="Id" /> 
      </Principal> 
      <Dependent Role="ObjectDetail"> 
       <PropertyRef Name="MyObjectId" /> 
      </Dependent> 
      </ReferentialConstraint> 
     </Association> 

CSDL:

 
    <Association Name="FK_MyObjectDetail_MyObject"> 
      <End Type="MyEntities.MyObject" Role="MyObject" Multiplicity="1"> 
      <OnDelete Action="Cascade" /> 
      </End> 
      <End Type="MyEntities.MyObjectDetail" Role="ObjectDetail" Multiplicity="0..1" /> 
      <ReferentialConstraint> 
      <Principal Role="MyObject"> 
       <PropertyRef Name="Id" /></Principal> 
      <Dependent Role="ObjectDetail"> 
       <PropertyRef Name="MyObjectId" /> 
      </Dependent> 
      </ReferentialConstraint> 
     </Association> 

(該<OnDelete>在C SDL已經由我手動添加,如http://codepolice.net/2008/12/16/cascade-delete-in-entity-framework/

我是否在做任何錯誤的事情,或者這在EF的v1中是不可能的?

回答

2

我想你可以通過與相關對象..類似的ID更新myObject.myPropertyReference =新的EntityKey解決這個問題:

myObject.myPropertyReference.EntityKey = EFExtensions.GetEntityKey(背景下,「myObjectID 「,myObject.myObjectID);

搜索EFExtension ..你不需要這個,因爲有一種方法可以在沒有它的情況下創建EntityKey。

希望有幫助!

+0

輝煌。這就是我一直在尋找的東西 - 謝謝!而不是EFExtensions,我只是使用:EntityKey = new EntityKey(「MyEntities.MyObjectDetailSet」,「MyObjectId」,id) – dkr88 2009-08-12 20:20:42

3

EF依靠數據庫進行級聯刪除。

例外情況是當子實體在內存中時。然後,EF也會刪除它,不符合級聯刪除規則。而是因爲它需要這樣做才能保持ObjectContext與數據庫中的Principal被刪除後期望數據庫的外觀保持同步。

這意味着如果您沒有在數據庫中設置級聯設置,並且未加載相關實體,那麼當您刪除該原則時EF不會刪除它們,因爲它假設數據庫會執行此操作。

查看Tip 33 - How cascade delete really works瞭解更多信息。

這有幫助嗎?

亞歷克斯·詹姆斯

實體框架團隊

+0

因此,我們需要做出什麼樣的改變才能使這種情況「正常工作」? – 2010-05-21 11:37:56

1

This blog entry實際引用的這個問題作爲它提出了一個解決這個問題的一個例子。