[英]Does SQL CE 4 (CTP) support ambient transactions using System.Transaction namespace?
[英]Using System.Transaction how to update multiple rows in Entity Framework
我想使用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()'返回的执行策略,将事务中的所有操作作为一个可重试的单元来执行。
有人可以帮助我如何处理这个问题吗?
您的问题是Microsoft 文档中描述的SqlServerRetryingExecutionStrategy
当不使用重试执行策略时,您可以将多个操作包装在单个事务中。 例如,以下代码在单个事务中包装了两个 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();
}
}
});
您也可以全局设置策略,但这取决于您要实现的目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.