删除具有未加载子实体的实体

时间:2009-08-12 19:04:02

标签: c# entity-framework ado.net

我需要在实体框架中进行一些澄清重新级联删除,尽管搜索了几个小时,但是没有更接近解决方案。

简而言之,如果我有一个与子(MyObjectDetail)具有1> 0..1关系的实体(MyObject),那么在没有UpdateException抱怨约束的情况下我无法删除MyObject - 但是仅在时,子项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()),那么它可以正常工作。

我的问题当然是,每次我想要删除父MyObject时,我不想(读取:不能)从MyObjectDetail加载varbinary字段。这是可能的,还是我将不得不破解一些手动SQL调用才能使其工作?

在SQL server中:

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

关系设置为“级联”以进行更新和删除。

在EF Designer中:

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>

(CSDL中的&lt; OnDelete&gt;已根据http://codepolice.net/2008/12/16/cascade-delete-in-entity-framework/等文章手动添加

我做错了什么,或者这在EF的v1中根本不可能?

3 个答案:

答案 0 :(得分:3)

EF依赖数据库进行级联删除。

例外是子实体在内存中。然后EF也会删除它,而不是满足级联删除规则。但是,因为它需要这样做才能使ObjectContext与数据库中删除Principal后数据库的预期同步。

这意味着如果您在数据库中没有级联设置,并且未加载从属实体,则在删除原则时EF不会删除它们,因为它假定数据库将执行此操作。

有关详细信息,请参阅Tip 33 - How cascade delete really works

这有帮助吗?

亚历克斯詹姆斯

实体框架小组

答案 1 :(得分:2)

我认为你可以通过使用相关对象的id更新myObject.myPropertyReference = new EntityKey来解决这个问题。例如:

myObject.myPropertyReference.EntityKey = EFExtensions.GetEntityKey(context,“myObjectID”,myObject.myObjectID);

搜索EFExtension ..你不需要这个,因为没有它可以创建EntityKey。

希望有所帮助!

答案 2 :(得分:1)

This blog entry实际上引用了问题作为问题的示例,并提出了解决方案。