【问题标题】:Entity Framework cascading delete problems - Foreign key set to null实体框架级联删除问题 - 外键设置为 null
【发布时间】:2010-03-31 07:25:16
【问题描述】:

我使用实体框架映射了以下模型: Mitglied -> Auftrag -> Teilprojekt

我已经使用外键和“删除级联”在数据库中设置了所有内容。如果我对数据库执行一些测试,一切正常。当我使用实体框架添加和删除对象时,问题就出现了。 考虑以下代码:

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>

如果我将 Teilprojekte 表上的 AuftragsID 设置为非空,那么我会从实体框架中收到以下错误:

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'))

谁能帮助我并告诉我出了什么问题以及如何解决这个问题? 谢谢

【问题讨论】:

  • Multiplicity="0..1" 似乎是错误的。在将Teilprojekte.AuftragsID 设置为NOT NULL 后,您是否尝试过重新生成模型?根据您的模型,未能删除t2 是正确的,但我认为您的模型不符合您的要求。
  • 您好,我已经尝试过多次重新生成整个架构,但现在似乎可以了!!我不知道确切的原因,但它有效。谢谢

标签: c# entity-framework cascading-deletes


【解决方案1】:

EDMX 中的级联删除只会级联加载(附加)的实体。因此,除非您的实体已加载,否则它不会级联删除。 EF 期望您的数据库级联删除。

  1. 确保在数据库中设置了级联删除
  2. 在您的 EDMX 中设置级联删除
  3. 如果你不能做到 1,请确保在删除之前加载所有实体

【讨论】:

  • 您好,感谢您的回答。我已经知道这一点,并且我的数据库设置正确(所有表上都有级联删除),因为当我尝试删除数据库中的 Auftrag 时,所有内容都被正确删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 2017-01-06
相关资源
最近更新 更多