3

我在使用复合键级联删除依赖对象时遇到问题。具体来说,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

4

1 回答 1

0

框架可能会吞下一些错误 - 它有时会发生。我认为有一些与 Sql Profiler for DB2 等价的东西……我会分析数据库的活动,看看那里发生了什么。如果您根本没有看到删除的调用,那么至少您已经消除了错误的一种可能性。

于 2011-01-10T20:27:12.280 回答