我需要在实体框架中进行一些澄清重新级联删除,尽管搜索了几个小时,但是没有更接近解决方案。
简而言之,如果我有一个与子(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中根本不可能?
答案 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实际上引用了此问题作为问题的示例,并提出了解决方案。