抑制TransactionScope登记只读EF上下文?

时间:2010-08-23 20:19:59

标签: .net entity-framework datacontext transactionscope msdtc

我有一个场景,我需要打开多个指向不同数据库的datacontexts。我只写了一个数据库,然后从其他数据库中读取......所以从技术上讲,交易只能针对其中一个数据库。

我想避免将TransactionScope升级到分布式事务中,所以我不必担心MSDTC ...有没有办法在事务中只有一个上下文登记?

2 个答案:

答案 0 :(得分:2)

我不确定这是否会将第二个连接添加到事务中,但您可以尝试在您的选择中禁止transactioncope:

using (new TransactionScope(TransactionScopeOption.Suppress))
{}

答案 1 :(得分:1)

我一直在研究Linq到Sql的类似问题 - 最初我们的解决方案是每个请求使用相同的连接。 Rick Strahl做了一系列博客文章,值得关注。

在我们的解决方案中,DataContext构造函数有一个重载的构造函数,用于从工厂检索连接(如果不存在连接,则传递的连接存储在线程上)

public DataContext1(connection)
    : base (ConnectionFactory.GetConnectionFromContext(connection))
{
}

这似乎在WCF场景中工作正常,连接工厂可以从ServiceModel.OperationContext.Items集合中存储/检索,并且(更重要的是)订阅OperationComplete事件以便在线程上关闭/处置连接所有操作完成后。

我发现我们还需要扩展连接对象,以便在处理拥有的datacontext时(例如,在每个操作范围完成之后),可以防止内部连接的自动关闭/挖掘。

我现在正在看非WCF场景...... TBH它并不漂亮。我们也没有WCF上下文中的'OperationCompleted'事件触发器。