1

我首先使用 EF5 代码,我需要SaveChanges()在同一个事务中包装多个调用。我对使用 transactionScope 比较陌生,似乎无法调整它的选项来完成我想要做的事情。

以下代码位于一个服务类中,该服务类被注入了我的 DbContext 类的实例。我不会在此类中的任何位置创建额外的 DbContext 实例。

起初我尝试了以下方法。代码很好很干净,但它会在函数中的SaveChanges方法期间尝试升级到 DTC 。GenerateInvoice

using (var scope = new TransactionScope())
{
    // This function does some work and calls SaveChanges
    Guid invoiceId = GenerateInvoice(cart);  

    // This function also does some querying and calls SaveChanges
    DeleteCart();

    // Transaction should only commit if both functions above were successful
    scope.Complete();

}

我做了一些研究并将代码更改为以下不会升级为 DTC 的代码,但我不确定这是否是最好的方法。

IObjectContextAdapter adapter = (IObjectContextAdapter)_context;

adapter.ObjectContext.Connection.Open();

using (var scope = new TransactionScope())
{

    // This function does some work and calls SaveChanges
    Guid invoiceId = GenerateInvoice(cart);  

    // This function also does some querying and calls SaveChanges
    DeleteCart();

    // Transaction should only commit if both functions above were successful
    scope.Complete();

    adapter.ObjectContext.Connection.Close();

}

SaveChanges有没有一种更简单的方法可以在不升级到 DTC的情况下首先通过多个 EF5 代码获得事务支持?

谢谢

4

1 回答 1

2

不是我发现的。这也很有意义。SaveChanges()通过多次调用,您可能会打开与数据库的多个连接。跨这些连接协调事务的唯一方法是使用分布式事务(因此是 MSDTC)。

我能想出的最佳解决方案是只调用SaveChanges()一次。这可能意味着重组一些代码,但最好是所有需要事务性的实体都同时提交。

仅调用SaveChanges()一次还允许 EF 更改跟踪器使用其缓存并节省大量应用程序和数据库之间的通信。

于 2012-11-27T20:24:22.743 回答