MVC 事物

前一阵学习mvc但是对于关联表的数据操作总是分裂开来写,这样有很大的侥幸,比如嵌套了3个

if(){   

      if(){

             if(){

                }

         }

}

如果前两个都是true那么最后一个是false了,这样是不想看到的结果,这样的话前两个数据已经操作成功了数据库已经存在记录了,但是第三个没有成功,这样就不能保证这个数据属性的一致性了,

其实即使一个错误的写法,但是一直不知道怎么办,之前在三层里面所有的sql语句执行都会有一个sqltransaction的封装的事物方法调用,但是在mvc中使用linq  to  sql 却不知道怎么办了,

最后有群友提示用存储写,这个还没有测试,先把事物的这个写一下吧。对于初学者一个建议。首先要=》添加引用System.Transactions=》在代码中引用using System.Transactions;

下面是几种测试的情况,效果会解释出,但是不敢说绝对正确,毕竟能力有限。

11111111111111111111111111111111111111111111111111111111111111111111111111111111111

 

using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    Students sd = new Students()
                    {
                        Sex = 0,
                        StudentName = "赵七语文语文"
                    };
                    db.Students.Add(sd);
                    Courses cs = new Courses()
                    {
                        CourseName = "语文语文语文语文语文语文语文"//这个会报错,因为数据库的大小设置为nvarchar(2),错误;将截断二进制。。。。这个大家都明白是为啥,不解释了
                    };

                    db.Courses.Add(cs);
                    db.SaveChanges();
                    scope.Complete();
                }
                catch (Exception)
                {

                    throw;
                }
            }

这个事物会回滚

22222222222222222222222222222222222222222222222222222222222222222222
                try
                {
                    Students sd = new Students()
                    {
                        Sex = 0,
                        StudentName = "赵七语文语文"

                    };
                    db.Students.Add(sd);
                    Courses cs = new Courses()
                    {
                        CourseName = "语文语文语文语文语文语文语文"
                    };

                    db.Courses.Add(cs);
                    db.SaveChanges();
                }
                catch (Exception)
                {
                    
                    throw;
                }

这个没有用事物但是只有一个db.SaveChanges();这样同样可以达到效果,两条数据都没有插入但数据库,可以理解db.SaveChanges();提交时做了一个整体的提交,我想它也是一个事物提交的原理,或者这个方法就是

有事物。具体没有研究。

3333333333333333333333333333333333333333333333333333333333333333

 using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    Students sd = new Students()
                    {
                        Sex = 0,
                        StudentName = "赵七语文语文"

                    };
                    db.Students.Add(sd);
                    db.SaveChanges();
                    Courses cs = new Courses()
                    {
                        CourseName = "语文语文语文语文语文语文语文"
                    };
                    db.Courses.Add(cs);
                    db.SaveChanges();
                    scope.Complete();
                }
                catch (Exception)
                {
                    
                    throw;
                }
            }

这个同样可以实现事物回滚,这里有一个地方可以很明显的看到这个using块的执行,我们上面是两个实体,当断点执行完第一个db.SaveChanges();时候我们可以到数据库下一个简单的查询句

就是查询刚刚添加数据的这个表,这时你会发现这条语句会一直在执行,只要你的代码断点还在那里不用这条语句就查不出来数据,这说明,这个代码块或者是整体提交数据到数据库的,这样就似乎就更明白

了(这个不必纠结只是个人发现的)

4444444444444444444444444444444444444444444444444444444444444444444444
                try
                {
                    Students sd = new Students()
                    {
                        Sex = 0,
                        StudentName = "赵七语文语文"

                    };
                    db.Students.Add(sd);
                    db.SaveChanges();
                    Courses cs = new Courses()
                    {
                        CourseName = "语文语文语文语文语文语文语文"
                    };
                    db.Courses.Add(cs);
                    db.SaveChanges();
                }
                catch (Exception)
                {
                    
                    throw;
                }    

这个写法会抛出错误,但是第一个实体的数据已经保存到数据库,但是第二条数据没有保存,这就是我刚开始遇到的一直困惑的问题。表达的浅显希望卡伊采纳。          

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

posted @ 2016-01-20 16:02  山顶洞外人  阅读(234)  评论(0编辑  收藏  举报