c# - 使用 System.Transaction 如何更新实体框架中的多行
问题描述
我想使用System.Transactions
和更新多行。我的数据库是使用实体框架连接的。
以下是我尝试过的代码,但它会引发错误:
public void Update(List<PortfolioCompanyLinkModel> record)
{
var transaction = _context.Database.BeginTransaction();
try
{
foreach (var item in record)
{
var portfolioCompanyLink = _context.PortfolioCompanyLink.FirstOrDefault(p => p.Id == item.Id);
portfolioCompanyLink.ModifiedBy = _loggedInUser;
portfolioCompanyLink.ModifiedOn = DateTime.UtcNow;
portfolioCompanyLink.URL = item.URL;
_context.SaveChanges();
//_context.PortfolioCompanyLink.Update(portfolioCompanyLink);
}
transaction.Commit();
}
catch(Exception ex)
{
transaction.Rollback();
}
}
错误:
配置的执行策略“SqlServerRetryingExecutionStrategy”不支持用户发起的事务。使用 'DbContext.Database.CreateExecutionStrategy()' 返回的执行策略将事务中的所有操作作为可重试单元执行。
有人可以帮我解决这个问题吗?
解决方案
您的问题是SqlServerRetryingExecutionStrategy
Microsoft 文档中所述
当不使用重试执行策略时,您可以将多个操作包装在单个事务中。例如,以下代码将两个 SaveChanges 调用包装在一个事务中。如果任一操作的任何部分失败,则不会应用任何更改。
System.InvalidOperationException:配置的执行策略“SqlServerRetryingExecutionStrategy”不支持用户发起的事务。使用 'DbContext.Database.CreateExecutionStrategy()' 返回的执行策略将事务中的所有操作作为可重试单元执行。
解决方案:手动调用执行策略
var executionStrategy = _context.db.CreateExecutionStrategy();
executionStrategy.Execute(
() =>
{
// execute your logic here
using(var transaction = _context.Database.BeginTransaction())
{
try
{
foreach (var item in record)
{
var portfolioCompanyLink = _context.PortfolioCompanyLink.FirstOrDefault(p => p.Id == item.Id);
portfolioCompanyLink.ModifiedBy = _loggedInUser;
portfolioCompanyLink.ModifiedOn = DateTime.UtcNow;
portfolioCompanyLink.URL = item.URL;
_context.SaveChanges();
//_context.PortfolioCompanyLink.Update(portfolioCompanyLink);
}
transaction.Commit();
}
catch(Exception ex) {
transaction.Rollback();
}
}
});
您也可以全局设置策略,但这取决于您要实现的目标。
推荐阅读
- ios - 更改框架源代码时更新应用程序内的框架
- asp.net-core - Azure,错误 403 - 禁止:需要客户端证书
- php - Mysql SELECT函数在字段列表中返回未知列错误
- oracle - 触发器中忽略的 SQL 语句?
- android - 在另一个活动类中保留变量值
- javascript - Laravel 6 - @push 和 @stack
- json - 为什么我从 mongodb 的 json 中的某些字段的值全为零?
- android - @Path 作为可选参数?
- angular - Angular:FileReader - 来自阅读器的访问列表
- android - weight=1 和 android:layout_width="0dp" 使我的视图消失