实体框架级联删除问题 - 外键设置为null [英] Entity Framework cascading delete problems - Foreign key set to null

查看:307
本文介绍了实体框架级联删除问题 - 外键设置为null的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下型号我与实体框架映射:
Mitglied - >定做 - > Teilprojekt



我已经设置了一切在数据库以ON DELETE CASCADE外键和。如果我在数据库上执行一些测试,一切正常。这个问题,只要我使用实体框架添加和删除尤其是出现的对象。
请看下面的代码:

  Mitglieder M1 =新Mitglieder(); 
m1.Name =erstes;

Auftraege A1 =新Auftraege();
a1.Name =A1;
m1.Auftraege.Add(A1);

Teilprojekte T1 =新Teilprojekte();
t1.Name =T1;
a1.Teilprojekte.Add(T1);

context.AddToMitglieder(M1);


Mitglieder M2 =新Mitglieder();
m2.Name =zweites;

Auftraege A2 =新Auftraege();
a2.Name =A2;
m2.Auftraege.Add(A2);

Teilprojekte T2 =新Teilprojekte();
t2.Name =T2;
a2.Teilprojekte.Add(T2);

context.AddToMitglieder(平方米);
context.SaveChanges();

这增加了所有正确的对象和设置外键。如果我再执行下面的代码删除Auftraege:

  VAR成员= context.Mitglieder.ToList(); 

VAR MEM1 = members.Single(M = GT; m.Name ==erstes);
mem1.Auftraege.Load();
VAR AUF1 = mem1.Auftraege.First();
context.DeleteObject(AUF1);

VAR MEM2 = members.Single(M = GT; m.Name ==zweites);
mem2.Auftraege.Load();
VAR auf2 = mem2.Auftraege.First();

//这是导致差异
auf2.Teilprojekte.Load THE LINE();

context.DeleteObject(auf2);

context.SaveChanges();



两个Auftraege a1和a2被正确删除;也Teilprojekt t1被删除,但Teilprojekt T2不会被删除;!



其AuftragID列设置为NULL



唯一的区别是,A1我没有加载Teilprojekte和A2我并加载它们。我不明白这是为什么不能正常工作。另外在SSDL一切设置正确:

 <协会名称=FK_Auftraege_Mitglieder> 
<作用到底=MitgliederTYPE =TechnBuero.Store.Mitglieder多重=0..1>
< OnDelete行动=级联/>
< /结束>
<作用到底=AuftraegeTYPE =TechnBuero.Store.Auftraege多重=*/>
< ReferentialConstraint>
<校长角色=Mitglieder>
< PropertyRef名称=ID/>
< /首席>
<从属角色=Auftraege>
< PropertyRef NAME =Mitglieder_ID/>
< /依赖型GT;
< / ReferentialConstraint>
< /协会>
< /协会>
<协会名称=FK_Teilprojekte_Auftraege>
<作用到底=AuftraegeTYPE =TechnBuero.Store.Auftraege多重=0..1>
< OnDelete行动=级联/>
< /结束>
<作用到底=TeilprojekteTYPE =TechnBuero.Store.Teilprojekte多重=*/>
< ReferentialConstraint>
<校长角色=Auftraege>
< PropertyRef名称=ID/>
< /首席>
<从属角色=Teilprojekte>
< PropertyRef NAME =AuftragsID/>
< /依赖型GT;
< / ReferentialConstraint>
< /协会>

如果我设置了AuftragsID放在桌子上Teilprojekte不为空,然后我从实体以下错误框架:

 错误1错误3023:问题在映射碎片开始线638,702:列Teilprojekte.AuftragsID没有缺省值并且不能为空。列值是需要存储实体数据。 
将实体与密钥(PK)不会往返时:
((PK是TeilprojekteEntitySet的还是PK扮演的角色Teilprojekte的AssociationSetFK_Teilprojekte_Auftraege')和(PK是不是在TeilprojekteEntitySet的还是PK不AssociationSetFK_Teilprojekte_Auftraege发挥作用Teilprojekte'))

能任何人能帮助我,告诉我是怎么回事错的,我怎么能解决这个问题呢?
谢谢


解决方案

级联在EDMX只会加载级联(附后)的实体删除。所以,除非你的实体被加载它不会级联删除。 EF期待您的数据库级联删除。




  1. 确保你有一个级联删除设置在您的数据库

  2. 设置级联删除你的EDMX

  3. 如果你不能做到1,删除


  4. I have the following Model which I mapped with the Entity Framework: Mitglied -> Auftrag -> Teilprojekt

    I have set up everything in the database with foreign keys and "on delete cascade". If I perform some tests on the database everything works fine. The problem arises as soon as I use the Entity Framework to add and especially delete objects. Consider the following code:

    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();
    

    This adds correctly all the objects and sets the foreign keys. If I then execute the following code to delete the 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();
    

    The two Auftraege a1 and a2 are correctly deleted; also the Teilprojekt t1 is deleted but the Teilprojekt t2 is not deleted;

    Its AuftragID column is set to NULL!

    The only difference is that for a1 I did not load the Teilprojekte and for a2 I did load them. I don't understand why this is not working properly. Also in the SSDL everything is set up correctly:

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

    If I set the AuftragsID on the table Teilprojekte to not null then I get the following error from the Entity Framework:

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

    Can anyone help me and tell me what is going wrong and how I can solve this issue? Thanks

    解决方案

    The cascade delete in the EDMX will only cascade loaded (attached) entities. so unless your entity is loaded it is not going to cascade the delete. EF is expecting your db to cascade the delete.

    1. Make sure you have a cascade delete set up in your database
    2. Set the cascade delete in your EDMX
    3. If you can't do 1, make sure you load all entities before deleting

    这篇关于实体框架级联删除问题 - 外键设置为null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆