c#实体框架在数据库上引发异常但不回滚
我有一个简单的查询,可以更新数据库中的两个表c#实体框架在数据库上引发异常但不回滚,c#,mysql,sql,entity-framework,model-view-controller,C#,Mysql,Sql,Entity Framework,Model View Controller,我有一个简单的查询,可以更新数据库中的两个表 public void UpdateLogins(int userId) { using (var context = new storemanagerEntities()) { user item = context.users.Where(x => x.id == userId).FirstOfDefault(); item.logins += 1; context.SaveC
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();
}
}
但如果我只是像这样在他们之间抛出一个“throw new Exception();”
context.SaveChanges();
throw new Exception();
account accountItem = context.accounts.Where(x => x.userId == userId).FirstOfDefault();
用户表未更新,但我的帐户表未更新,数据库保存这些更改。如果引发异常,如何让数据库回滚更改
谢谢。保存更改是一项事务。所以你有两个 正如其他人指出的,将所有事务都包含在父事务范围中,然后这两个事务将成为子事务 即,您将有1笔交易 或者最好只调用一次.SaveChanges() 使用模型进行操作时,应使用C#引用来连接模型,而不是通过ID。 有时这很困难,但这是ORMs的目标,让您能够以面向对象的方式工作 用户可以拥有一个帐户属性,该属性是OO术语中的连接,而不是ID。 帐户-用户属性相同 订单实例可以具有List OrderDetails属性 请看下面的示例: 您可以尝试以下方法: 数据将保存到数据库中,但不会提交 直到Scope.Complete()完成。尝试以下操作:
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();
}
使用
TransactionScope
。因此,将TransactionScope包装在“using var”周围,这是真的,但是如果我要添加一个新用户,然后向他们附加一个帐户,我需要调用savechanges来获取该用户的id,这样我就可以使用account.user_id=item。id@Canvas如果使用导航属性而不是外键属性,您不需要这样做。EF应该能够自动处理此问题。您的多个更改将添加到UnitOfWork中,该UnitOfWork位于保存发送到数据库的更改时。在那一点上,像你说的事情已经解决了。是的,在不使用用户id的情况下查找accountItem。@hvd的确,这是我的错,我没有想到:(我这边的数据库设计不好