【发布时间】: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 开发人员工具在commit或rollback上所做的任何事情都会在您调用相应的事务方法时发生。例如,即使您回滚,序列仍会递增。 -
// some other inserts and updates。这实际上决定了您是否真的需要开始交易。也许您可以在一次 SaveChanges 调用中保存整个对象图。谁知道呢。 -
我使用事务是因为我需要事务。它实际上是一个金融预订交易。如果一个帐户状态发生了变化,那么另一个帐户状态必须发生变化。中间操作提供必须与其他记录中的字段匹配的身份。如果出现任何故障,系统就会变得一团糟,需要进行认真的维护。交易保证无论如何 - 事情将被正确地完成(意味着完全)或根本不完成。
-
我相信你。只是不是每个人都知道 EF 能够使用生成的键值来设置外键同时原子地保存更改。我看到的只是你的问题和你的代码 sn-p,而不是你对 EF 的熟练程度。
标签: c# entity-framework .net-core entity-framework-core