none
使用EF,当使用事物时, SaveChanges()返回了1,但是数据库没有增加任何数据;去掉事物时,却反而添加成功了,why?????

    问题

  •   public static int AddTeacherAndUser(Teacher teacher, int[] Roles)
            {
                int rows = -1;
                teacher.IsDelete = 0;
                teacher.CreateTime = DateTime.Now;
                teacher.UpdateTime = DateTime.Now;

                #region 构造用户信息
                UserInfo user = new UserInfo
                      {
                          UserCode = teacher.Code,
                      };
                user.UserPwd = MD5Helper.EncryptByMD5(MD5Helper.MD5Head_CIDP + teacher.Code);
                if (Roles != null)
                {
                    user.Role = string.Join(",", Roles);
                }
                else
                {
                    user.Role = "";
                }
                #endregion
                using (TransactionScope scope = new TransactionScope())//启用事务
                {
                    using (LeaveEntities db = new LeaveEntities())
                    {
                        try
                        {
                            db.Teacher.Add(teacher);
                            db.UserInfo.Add(user);
                            rows = db.SaveChanges();
                        }
                        catch (Exception)
                        {
                            scope.Dispose();
                            //throw;
                        }
                    }
                }
                return rows;
            }

    我擦,很诡异有木有~

    2016年5月17日 13:15

答案

全部回复

  • 用sql profiler跟踪一下SQL语句

    catch (Exception)
                        {
                            scope.Dispose();
                             throw;  这一句抛出异常,看看有什么问题
                         }

    我以前遇到是的msdtc服务没有启动,尝试net start msdtc试一下


    专注于.NET MIS开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年5月17日 13:18
  • 1.catch (Exception)并没有捕获到异常

    2.看到的sql语句:

       2.1 插入Teacher表的:exec sp_executesql N'insert [dbo].[Teacher]([Code], [TeacherName], [TeacherType], [ClassCodes], [Tel], [Phone_Body], [Phone_Head], [QQCode], [IsDelete], [CreateTime], [UpdateTime])
    values (@0, @1, @2, null, null, null, null, null, @3, @4, @5)
    select [ID]
    from [dbo].[Teacher]
    where @@ROWCOUNT > 0 and [ID] = scope_identity()',N'@0 nvarchar(30),@1 nvarchar(30),@2 nvarchar(30),@3 int,@4 datetime2(7),@5 datetime2(7)',@0=N'201501',@1=N'我问问',@2=N'on',@3=0,@4='2016-05-18 09:09:24.2082472',@5='2016-05-18 09:09:24.2082472'

       2.2插入UserInfo表的:exec sp_executesql N'insert [dbo].[UserInfo]([UserCode], [UserPwd], [Role])
    values (@0, @1, @2)
    ',N'@0 nvarchar(30),@1 nvarchar(50),@2 nvarchar(30)',@0=N'201501',@1=N'c898f1b54eac25053d2d582114b0cd85',@2=N''

    感觉sql插入没问题啊

    2016年5月18日 1:12
  • 当应用程序完成它要在一个事务中执行的所有工作以后,您应当只调用 Complete 方法一次,以通知事务管理器可以接受提交事务。未能调用此方法将中止该事务。

    http://feiyun0112.cnblogs.com/

    2016年5月18日 1:53
    版主
  • 同意feiyun0112的意见,TransactionScope的用法错误,参考下面的

    using (TransactionScope scope = CreateTransactionScope())
    {

       ...

       scope.Complete();

    }


    专注于.NET MIS开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年5月18日 2:26
  • 非常感谢您的答复,已经解决了,没能及时回复很抱歉~
    2016年5月26日 2:56
  • 谢谢您的建议~
    2016年5月26日 2:56