entity framwork的TransactionScope事务回滚问题

connie3 2013-01-15 06:10:54
public string ReceiveOrder(int custId, string xml){
try
{
using (JXEntities jx = new JXEntities())
{

using (TransactionScope transaction = new TransactionScope())
{
[color=#FF6600]jx.Connection.Open();[/color] //加载
XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(xml);
XmlNode xmlOrderHead = xmldoc.SelectSingleNode("root");
string orderNo = "";
OrderHead o = new OrderHead();
if (xmlOrderHead != null)
{
try { remark = xmlOrderHead.SelectSingleNode("Remark").InnerText; }
catch { }
o.Remark = remark;
}
jx.OrderHeads.AddObject(o);
jx.SaveChanges();

XmlNodeList xmlOrderLine = xmlOrderHead.SelectNodes("lines");
OrderLine line = new OrderLine();
if (xmlOrderLine.Count > 0)
{
foreach (XmlNode node in xmlOrderLine)
{
try { pickTime = node.SelectSingleNode("PickTime").InnerText; }
catch { }
line.PickTime = pickTime;
jx.OrderLines.AddObject(line);
jx.SaveChanges();
}
transaction.Complete();
}
catch (Exception ex)
{
error = ex.Message;
}
代码运行后产生错误:基础提供程序在 Open 上失败。
InnerException = {"该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025)"}
网上查找解决方案,都说要配置本机和数据库所在的服务器的MSDTC。
但是我无意中添加了一句jx.Connection.Open()。就是红字的部分。结果运行成功没错误了。我就挺纳闷的,不知道是咋回事,谁能告诉下。
另外问个小白的问题, 运行using (JXEntities jx = new JXEntities())这句话,是不是自动打开数据库连接了?
...全文
302 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sqlchen 2013-02-08
  • 打赏
  • 举报
回复
引用 1 楼 wjq 的回复:
回答你最后那个问题,objectcontext对象对数据库的访问,遇到需要数据操作的时候才会open,然后close。 你的整个过程中,会开关数据链接多次。 个人猜测,不报错的原因是你手工open连接后,下次对数据操作就不再open/close了,而是都在同一个connection上操作。
支持1楼的分析,每次数据库交互(SaveChanges)都由EF自动open/close了连接,事务处理就认为需要维护多个连接,所以提示要DTC。 你自己开了EF就不进行open/close动作了,事务中就1个连接,事务就不需要dtc了。 感觉楼主的代码可以优化,jx.OrderLines.AddObject()全部完了后再开事务提交比较好吧?(也不用手工开关连接了)
wjq 2013-01-21
  • 打赏
  • 举报
回复
回答你最后那个问题,objectcontext对象对数据库的访问,遇到需要数据操作的时候才会open,然后close。 你的整个过程中,会开关数据链接多次。 个人猜测,不报错的原因是你手工open连接后,下次对数据操作就不再open/close了,而是都在同一个connection上操作。

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧