【发布时间】:2010-11-23 21:23:57
【问题描述】:
我在使用复合键级联删除 依赖对象时遇到问题。具体来说,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_B 之前删除 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/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)
【问题讨论】:
标签: entity-framework entity-framework-4 foreign-key-relationship composite-key edmx