gpt4 book ai didi

c# - 删除具有未加载子实体的实体

转载 作者:行者123 更新时间:2023-11-30 14:43:56 45 4
gpt4 key购买 nike

我需要对 Entity Framework 中的级联删除进行一些澄清,尽管搜索了几个小时,但我仍未找到解决方案。

简而言之,如果我有一个实体 (MyObject) 与子对象 (MyObjectDetail) 之间存在 1->0..1 关系,那么我无法删除 MyObject 而不会出现 UpdateException 提示约束 - 但是 仅当子 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 服务器中:

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

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

在 EF 设计器中:

MyObject [1] -> [0..1] MyObjectDetail

在 EF XML 中:

固态硬盘:

        <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中的 是我根据 http://codepolice.net/2008/12/16/cascade-delete-in-entity-framework/等文章手动添加的)

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

最佳答案

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

当子实体在内存中时异常(exception)。那么EF也会删除它,不满足级联删除规则。而是因为它需要这样做以使 ObjectContext 与数据库中删除 Principal 后数据库的外观保持同步。

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

参见 Tip 33 - How cascade delete really works获取更多信息。

这有帮助吗?

亚历克斯·詹姆斯

Entity Framework 团队

关于c# - 删除具有未加载子实体的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1268091/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com