2017-05-05 32 views
0

我们有一个ASP.NET Web应用程序,它首先使用EntityFramework代码来执行插入/更新,并且至少对于我们的某些数据库的外键,它们在我们插入行时不受信任使用EF。EF插入/更新后外键变得不可信

重要提示:

  • 外键都没有被标记为不可复制
  • 约束没有被明确禁用,然后重新启用,我知道,如果我们禁用和重新-enabling,我需要做的“WITH CHECK CHECK约束所有”
  • 我们不这样做批量插入发生这种情况时

我试过运行sql profiler来查看是否有什么奇怪的事情发生,我什么也没看到。我期待看看EF是否做了任何“MERGE”声明,因为我发现某些声明表明这些声明可能会使约束不可信。我的理解是,如果没有一些解决方法,EF不会做任何“MERGE”语句。我能想到的唯一一点与默认设置不同的是,快照隔离已打开,但我还没有发现任何可能会影响FK的信任的内容。

编辑:只是想补充一点,我已经运行了SQL语句来重新信任FK,然后在Web应用程序中运行一个序列,使相同的FK回到不可信的状态。它是可重复的。

还有什么可能导致它或我可以尝试确定为什么他们变得不受信任?

编辑:在我们正在使用EFUtilities库进行批量插入并且默认情况下此库没有启用或提供覆盖以启用底层SQLBulkCopy对象的约束检查的调用树中发现很深。我们已经分叉并修改了EFUtilities(原始项目几乎死在github上)库,以在SqlBulkCopyOptions中添加一个用于重命名的方法重载。

回答

0

我们使用库EFUtilities来进行批量插入,该插入不检查约束并且无法覆盖选项。我们最终分叉代码库并对库进行了一些更改,以提供将SQLBulkCopyOptions对象传递给InsertAll()方法的功能。我们的项目只在离线状态下存在,所以我没有github链接到我们做出的更改,但它与这些提交中所做的更改非常相似,只是我们违反了我们的检查约束:Adds support for SqlBulkCopyOptions on the 'InsertAll' interface. #35