2010-03-31 118 views
2

我有我與實體框架映射以下型號: Mitglied - >定做 - > Teilprojekt實體框架級聯刪除問題 - 外鍵設置爲null

我已經設置了一切與外鍵數據庫和「關於刪除級聯」。如果我對數據庫執行一些測試,一切正常。一旦我使用實體框架來添加和特別刪除對象,就會出現問題。 考慮下面的代碼:

Mitglieder m1 = new Mitglieder(); 
m1.Name = "erstes"; 

Auftraege a1 = new Auftraege(); 
a1.Name = "a1"; 
m1.Auftraege.Add(a1); 

Teilprojekte t1 = new Teilprojekte(); 
t1.Name = "t1"; 
a1.Teilprojekte.Add(t1); 

context.AddToMitglieder(m1); 


Mitglieder m2 = new Mitglieder(); 
m2.Name = "zweites"; 

Auftraege a2 = new Auftraege(); 
a2.Name = "a2"; 
m2.Auftraege.Add(a2); 

Teilprojekte t2 = new Teilprojekte(); 
t2.Name = "t2"; 
a2.Teilprojekte.Add(t2); 

context.AddToMitglieder(m2); 
context.SaveChanges(); 

這增加了正確的所有對象,並設置外鍵。如果我再執行下面的代碼刪除Auftraege:

var members = context.Mitglieder.ToList(); 

var mem1 = members.Single(m => m.Name == "erstes"); 
mem1.Auftraege.Load(); 
var auf1 = mem1.Auftraege.First(); 
context.DeleteObject(auf1); 

var mem2 = members.Single(m => m.Name == "zweites"); 
mem2.Auftraege.Load(); 
var auf2 = mem2.Auftraege.First(); 

//THIS IS THE LINE THAT MAKES THE DIFFERENCE 
auf2.Teilprojekte.Load(); 

context.DeleteObject(auf2); 

context.SaveChanges(); 

兩個Auftraege A1和A2是正確刪除; Teilprojekt t1也被刪除,但Teilprojekt t2不被刪除;

其AuftragID列設置爲NULL!

唯一的區別是對於a1,我沒有加載Teilprojekte,對於a2我沒有加載它們。我不明白爲什麼這不能正常工作。此外,在SSDL一切設置正確:

<Association Name="FK_Auftraege_Mitglieder"> 
     <End Role="Mitglieder" Type="TechnBuero.Store.Mitglieder" Multiplicity="0..1"> 
     <OnDelete Action="Cascade" /> 
     </End> 
     <End Role="Auftraege" Type="TechnBuero.Store.Auftraege" Multiplicity="*" /> 
     <ReferentialConstraint> 
     <Principal Role="Mitglieder"> 
      <PropertyRef Name="ID" /> 
     </Principal> 
     <Dependent Role="Auftraege"> 
      <PropertyRef Name="Mitglieder_ID" /> 
     </Dependent> 
     </ReferentialConstraint> 
    </Association> 
    </Association> 
     <Association Name="FK_Teilprojekte_Auftraege"> 
     <End Role="Auftraege" Type="TechnBuero.Store.Auftraege" Multiplicity="0..1"> 
     <OnDelete Action="Cascade" /> 
     </End> 
     <End Role="Teilprojekte" Type="TechnBuero.Store.Teilprojekte" Multiplicity="*" /> 
     <ReferentialConstraint> 
     <Principal Role="Auftraege"> 
      <PropertyRef Name="ID" /> 
     </Principal> 
     <Dependent Role="Teilprojekte"> 
      <PropertyRef Name="AuftragsID" /> 
     </Dependent> 
     </ReferentialConstraint> 
    </Association> 

如果我設置AuftragsID在桌子上Teilprojekte不爲空,然後我從實體框架以下錯誤:

Error 1 Error 3023: Problem in Mapping Fragments starting at lines 638, 702: Column Teilprojekte.AuftragsID has no default value and is not nullable. A column value is required to store entity data. 
An Entity with Key (PK) will not round-trip when: 
((PK is in 'Teilprojekte' EntitySet OR PK plays Role 'Teilprojekte' in AssociationSet 'FK_Teilprojekte_Auftraege') AND (PK is NOT in 'Teilprojekte' EntitySet OR PK does NOT play Role 'Teilprojekte' in AssociationSet 'FK_Teilprojekte_Auftraege')) 

任何人的幫助我告訴我哪裏出了問題,我該如何解決這個問題? 謝謝

+0

'Multiplicity =「0..1」'似乎是錯誤的。將'Teilprojekte.AuftragsID'設置爲'NOT NULL'後,您是否嘗試重新生成模型?根據你的模型,未能刪除't2'是正確的,但我認爲你的模型對於你想要的是錯誤的。 – 2010-03-31 12:38:55

+0

你好,我已經嘗試了很多次重新生成整個架構,但現在它似乎工作! 我不知道確切的原因,但它的工作原理。 謝謝 – Manfred 2010-04-06 06:37:33

回答

2

在EDMX級聯刪除將只級聯加載(附件)的實體。所以除非您的實體被加載,否則不會級聯刪除。 EF期待您的數據庫級聯刪除。

  1. 請確保您有級聯刪除數據庫中的設置
  2. 設置級聯刪除您的EDMX
  3. 如果你不能做到1,請確保您加載所有實體刪除
+0

嗨, 謝謝你的答案。我已經知道這一點,我的數據庫設置正確(所有表上的級聯刪除),因爲當我試圖刪除數據庫中的Auftrag時,所有內容都被正確刪除。 – Manfred 2010-04-06 06:13:38