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