【发布时间】:2012-09-30 08:53:14
【问题描述】:
使用实体框架(在我的例子中首先是代码),我有一个操作需要我调用 SaveChanges 来更新数据库中的一个对象,然后再次调用 SaveChanges 来更新另一个对象。 (我需要第一个 SaveChanges 来解决 EF 无法确定首先更新哪个对象的问题)。
我试过了:
using (var transaction = new TransactionScope())
{
// Do something
db.SaveChanges();
// Do something else
db.SaveChanges();
tramsaction.Complete();
}
当我运行它时,我在第二个SaveChanges 调用中得到一个异常,说“底层提供程序在打开时失败”。内部异常说我的机器上没有启用 MSDTC。
现在,我在其他地方看到了描述如何启用 MSDTC 的帖子,但似乎我还需要启用网络访问等。这听起来完全是矫枉过正,因为没有涉及其他数据库,更不用说其他服务器。我不想做会降低整个应用程序安全性(或速度变慢)的事情。
肯定有更轻量级的方式来做这件事(最好没有 MSDTC)?!
【问题讨论】:
-
您使用的是 SQL 2008 吗?根据您的实际逻辑,您可以打开多个连接而无需升级。当 DTC 被调用时,这是一篇很棒的帖子:Transaction scope Automatically escalating to MSDTC
-
如果您想在一次事务中完成所有操作,保存一次或多次保存所有内容有什么区别?在这两种情况下,要么保存所有内容,要么不保存任何内容,因此我看不到多次保存的任何优势。根据下面的评论 - 在 Sql Server 2005 中,在事务中打开多个连接(即使源相同)会导致事务被提升为分布式事务。这在 Sql Server 2008 中得到了改进,您可以在 trx 中打开到同一数据源的多个连接,而不会导致升级
-
@markoreta:我使用的是 SQL Server 2012。我没有(或想要)多个连接,也不想使用 MSDTC!
-
@pawel:我不明白。我认为每个 SaveChanges 都会使用自己的事务,因此第一个可能会成功,第二个可能会失败并回滚,从而使我的数据库不一致。这就是为什么我认为我需要外部交易。我错了吗?
-
如果存在环境事务,您的连接将自动注册到此事务中,并且 SavaChanges 不会创建新事务。此外,SqlServer 并不真正支持嵌套事务(即嵌套的 Begin Tran 被忽略)
标签: entity-framework sql-server-2012 transactionscope entity-framework-5 msdtc