Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#实体框架在数据库上引发异常但不回滚_C#_Mysql_Sql_Entity Framework_Model View Controller - Fatal编程技术网

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的确,这是我的错,我没有想到:(我这边的数据库设计不好