使用code first 。在使用事务时,如下面代码,会自动调用MSDTC 。
using (MyEntities context = new MyEntites())
{
using (TransactionScope trans = new TransactionScope())
{
List<Ent1> list1=(from o in context.Ent1 select o).ToList(); //这里有一些查询,有2条以上查询,scope就自动调用msdtc
List<Ent2> list2=(from o in context.Ent2 select o).ToList();
。。。。
}。。。。
}
因为部署的关系,不想用MSDTC,我在MSDN上看到有个说明,说显式打开连接可以避免使用
MSDTC,代码如下:
using (MyEntities context = new MyEntites())
{
using (TransactionScope trans = new TransactionScope())
{
context.Connection.Open();
...Do Stuff...
trans.Complete();
}
}
网址是这个:http://msdn.microsoft.com/en-us/library/bb738523.aspx
但是这个可能是 4.0时候的写法,我照这种方式处理,结果会出现异常,在构造查询时候不能使用打开的连接。在stackoverflow搜索了很多帖子也没找到解决办法。
请教大牛,该如何使用带查询的事务且不用MSDTC?
推荐参考文章:C#综合揭秘——细说事务
dudu,我仔细看了这篇BLOG,并没有解决我的问题,我的问题与他文章中entityframework使用事务部分可能有两个差异:
1 我用entityframework code first .
2 在事务中多次使用了查询,才引起事务升级为MSDTC 。但是我不想使用MSDTC,担心客户的环境中没有安装这东东。
@Simple is best: 参考一下这篇文章.NET: how to disable promotion in System.Transactions?
@dudu: 这篇我也看过,并没有解决我的问题。
我的问题归纳起来很简单,用code first,只要执行2次或以上的query或savechanges,就调用MSDTC,否则就报错:基础提供程序在 Open 上失败
最终我在stackoverflow 上看到另一个帖子,说要code first要sql2008以上才支持数据库内部事务。
回答问题收藏。。。。
一个savechanges不会提升为msdtc,多个savechanges会自动提升为msdtc