我的依赖对象的级联删除与复合键存在问题。具体来说,EF发出的SQL指令试图删除依赖实体之前的主要实体。
我在我的EF模型的CSDL和SSDL中都设置了OnDelete="Cascade"
,并且明确地将依赖实体加载到内存中,因此EF知道要处理它们。我在另一个FK关系中正常工作,EF在删除原则之前正确删除了子实体。
但是,它不是在这种情况下,我怀疑这是因为依赖实体有一个复合键。简要介绍一下架构:
Entity A Entity B Entity A_B
ID (PK) ID (PK) A_ID (PK, FK to A)
B_ID (PK, FK to B)
我希望在删除实体A时删除实体A_B的条目。
我可以查看ObjectStateManager并查看A的A_B实体在内存中加载并标记为删除,但EF发出SQL命令以删除A 删除其A_B之前。当依赖实体有自己的PK时,这种方法很好,但是当它是复合键时似乎会被绊倒。即使我明确告诉EF的FK协会(SSDL和CSDL)删除应该是级联的,它也不会首先删除子节点。
同样,我将A和它的A_B加载到内存中,并且ObjectStateManager将它们全部标记为要删除。我正在使用启用了代理创建的POCO,尽管我通过对Context的LoadProperty调用显式加载了内存中的子实体。
有没有人见过这个?复合键真的是问题还是只是分心?为什么EF在一种情况下以正确的顺序处理SQL命令而不是另一种情况?
编辑:我已阅读OnDelete(http://msdn.microsoft.com/en-us/library/cc716734.aspx)和关系管理(http://msdn.microsoft.com/en-us/library/ee373856.aspx)的文档。标题为“识别和不识别关系的考虑因素”一节似乎暗示我想要做的事情是可能的,而且确实是预期的。它可能是数据库EF提供程序集中的内容吗?我正在使用IBM.Data.DB2程序集来对抗Informix数据库,而不是针对SQL Server数据库。
(进一步更新:我已更新至IBM DB2 v9.7fp3a和EF Providers Beta Refresh - http://www.ibm.com/developerworks/forums/thread.jspa?threadID=345634&tstart=0)
答案 0 :(得分:0)
框架可能会误解某些错误 - 有时会发生错误。我假设有一些等同于Sql Profiler for DB2 ...我会分析数据库的活动,看看那里发生了什么。如果你根本没有看到删除的调用,至少你已经消除了一个错误的可能性。