[英]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.