我在使用复合键级联删除依赖对象时遇到问题。具体来说,EF 发出的 SQL 指令会尝试在依赖实体之前删除主体实体。
我已经OnDelete="Cascade"
在我的 EF 模型的 CSDL 和 SSDL 中进行了设置,并将依赖实体显式加载到内存中,以便 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 在删除 A_B之前发出 SQL 命令来删除 A。当依赖实体有自己的 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/ ) 的文档库/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)