【问题标题】:EF Core transactions - am I doing it right?EF Core 事务 - 我做对了吗?
【发布时间】:2021-03-26 08:59:54
【问题描述】:

我所知道的是 EF 为 DbContext.SaveChanges 创建事务。 但是我需要一个包括插入在内的操作块,并且我需要它们的身份结果来完成我的序列。 所以我所做的看起来像这样:

using var dbTransaction = context.DataBase.BeginTransaction();
try {
    context.Add(myNewEntity);
    context.SaveChanges();
    otherEntity.RefId = myNewEntity.Id;
    context.Update(otherEntity);
    // some other inserts and updates
    context.SaveChanges();
    dbTransaction.Commit();
}
catch {
    dbTransaction.Rollback();
    throw;
}

所以我在插入时调用SaveChanges 以获取身份而不是破坏关系。 它看起来像交易中的交易。这是正确的吗?是不是应该怎么做?我的意思是-Commit 不需要SaveChanges?我认为它只是保存更改,但我想确定。

【问题讨论】:

  • 对我来说看起来没问题...不,您不必在提交后执行另一个 SaveChanges。
  • 基本上,事务中的SaveChanges 相当于在不提交的情况下执行SQL 插入、更新、删除语句。因此,无论您(插入最喜欢的 sql 开发人员工具)对这些语句做什么也将发生在 SaveChanges 上,而 sql 开发人员工具在 commitrollback 上所做的任何事情都会在您调用相应的事务方法时发生。例如,即使您回滚,序列仍会递增。
  • // some other inserts and updates。这实际上决定了您是否真的需要开始交易。也许您可以在一次 SaveChanges 调用中保存整个对象图。谁知道呢。
  • 我使用事务是因为我需要事务。它实际上是一个金融预订交易。如果一个帐户状态发生了变化,那么另一个帐户状态必须发生变化。中间操作提供必须与其他记录中的字段匹配的身份。如果出现任何故障,系统就会变得一团糟,需要进行认真的维护。交易保证无论如何 - 事情将被正确地完成(意味着完全)或根本不完成。
  • 我相信你。只是不是每个人都知道 EF 能够使用生成的键值来设置外键同时原子地保存更改。我看到的只是你的问题和你的代码 sn-p,而不是你对 EF 的熟练程度。

标签: c# entity-framework .net-core entity-framework-core


【解决方案1】:

您的代码将正常工作,但我更喜欢这样做:

try {
    context.Add(myNewEntity);
   var result= context.SaveChanges();
    if(result==0){
       dbTransaction.Rollback();
        ... return  error
     }
    otherEntity.RefId = myNewEntity.Id;
    context.Update(otherEntity);
    // some other inserts and updates
    result=context.SaveChanges();
if(result==0){
       dbTransaction.Rollback();
        ... return  error
     }
    dbTransaction.Commit();
}
catch {
    dbTransaction.Rollback();
    throw;
}

如果您更新或添加或删除多条记录,这将非常有用。 在这种情况下,结果将返回影响记录的数量,而不是 result==0 我通常使用 if result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2017-12-26
    • 2023-01-22
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多