我有一个场景,我需要打开多个指向不同数据库的datacontexts。我只写了一个数据库,然后从其他数据库中读取......所以从技术上讲,交易只能针对其中一个数据库。
我想避免将TransactionScope升级到分布式事务中,所以我不必担心MSDTC ...有没有办法在事务中只有一个上下文登记?
答案 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'事件触发器。