[英]c# entity framework throw exception but no roll back on database
我有一个简单的查询,它更新了我的数据库中的两个表
public void UpdateLogins(int userId)
{
using (var context = new storemanagerEntities())
{
user item = context.users.Where(x => x.id == userId).FirstOfDefault();
item.logins += 1;
context.SaveChanges();
account accountItem = context.accounts.Where(x => x.userId == userId).FirstOfDefault();
accountItem.logins += 1;
context.SaveChanges();
}
}
但如果我只是“抛出新的异常();” 他们之间是这样的
context.SaveChanges();
throw new Exception();
account accountItem = context.accounts.Where(x => x.userId == userId).FirstOfDefault();
用户表未更新,但我的帐户表尚未更新,数据库保存这些更改。 如果抛出异常,如何告诉我的数据库回滚更改?
谢谢
试试这个 :
using (TransactionScope txScope = new TransactionScope())
{
using (var context = new storemanagerEntities())
{
user item = context.users.Where(x => x.id == userId).FirstOfDefault();
item.logins += 1;
context.SaveChanges();
account accountItem = context.accounts.Where(x => x.userId == userId).FirstOfDefault();
accountItem.logins += 1;
context.SaveChanges();
}
txScope.Complete();
}
每个.SaveChanges都是一个交易。 所以你有2个。
正如其他人所指出的那样,将所有内容包含在父TransactionScope中,然后这些将成为子事务。
即你将有1笔交易。
或者更好地只调用一次.SaveChanges()
使用模型时,应使用C#引用来连接模型,而不是使用ID。 有时这很困难,但这是ORM的目标,让你以OO术语工作。
用户可以拥有一个帐户属性,这是一个OO术语的连接,而不是ID。 帐户 - 用户属性相同。
订单实例可以具有List OrderDetails属性。
看看这里有很好的例子: EF Code First Cookbook - 食谱#4:向主实体添加细节
你可以试试这个:
数据将保存到数据库,但在Scope.Complete()完成之前不会提交。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.