2011-11-17 131 views
4

我有一個實體框架模型在SQL服務器後端。無法級聯刪除在EF中工作

我有兩個表格,Treatment和Segment。治療與分部有一對多的關係。在數據庫中,我對錶之間的外鍵關係進行級聯刪除設置,以便在刪除處理時,它的所有對應的段也會被刪除。這項工作,當我直接從數據庫中刪除治療。

在EF模型中,我也將「End1 OnDelete」屬性更改爲「Cascade」。但是,每當我嘗試刪除處理時,出現以下錯誤:

「操作失敗:無法更改關係,因爲一個或多個外鍵屬性是不可空的。如果該外鍵不支持空值,則必須定義新的關係,必須爲該外鍵屬性指定另一個非空值,否則將該外鍵屬性設置爲空值。或者不相關的對象必須被刪除。「

這裏就是我刪除處理代碼:

public bool Delete(Treatment myTreatment) 
     { 
      bool result = false; 

      using (myEntities myObjectContext = new myEntities()) 
      { 
       if (myTreatment.Treatment_ID == 0) 
       { 
        result = true; 
       } 
       else 
       { 
        if (myTreatment.EntityState == System.Data.EntityState.Detached) 
        { 
         myObjectContext.Treatments.Attach(myTreatment); 
        } 
        myObjectContext.ObjectStateManager.ChangeObjectState(myTreatment, System.Data.EntityState.Deleted); 
       } 
       result = (myObjectContext.SaveChanges() != 0); 
      } 
      return result; 
     } 

我在做什麼錯?

編輯 這裏是CSDL每@ Fauxtrot要求協會。

<Association Name="TreatmentSegment"> 
      <End Type="tamcModel.Treatment" Role="Treatment" Multiplicity="1" > 
      <OnDelete Action="Cascade" /> 
      </End> 
      <End Type="tamcModel.Segment" Role="Segment" Multiplicity="*" > 
      </End> 
      <ReferentialConstraint> 
      <Principal Role="Treatment"> 
       <PropertyRef Name="Treatment_ID" /> 
      </Principal> 
      <Dependent Role="Segment"> 
       <PropertyRef Name="Treatment_ID" /> 
      </Dependent> 
      </ReferentialConstraint> 
     </Association> 
+0

難道是有可能看到你的CSDL爲這個特定的協會? –

+3

您應該在數據庫中指定級聯刪除並更新您的EF模式。 EF將負責其餘的事情。 –

+0

@哈桑你能澄清一下嗎?我有在數據庫中指定的級聯刪除。 EF不應該自動查看並更新關係本身?似乎有一種直觀的手動更新EF模式,但如果是這樣的話,你如何建議我這樣做?我將該實體標記爲刪除。你是說我應該遍歷所有的子元素並將其實體狀態更改爲刪除?如果這些孩子元素也有他們自己的孩子元素呢?然後,我必須繼續遍歷子元素層以正確更新架構? –

回答

0

在玩了一會之後,我偶然發現了下面的解決方案。我在這裏發佈它,以便將來可能有此問題的其他人可以查看解決方案。

我改變了以下行:

myObjectContext.ObjectStateManager.ChangeObjectState(myTreatment, System.Data.EntityState.Deleted); 

要這樣:

myObjectContext.DeleteObject(myTreatment); 

現在工程....

hmmmm ....