【发布时间】:2021-10-05 00:50:43
【问题描述】:
在我的 API 控制器中,我有这样的代码:
[HttpPost]
public async Task<ActionResult<TransactionDto>> CreateNewTrasaction(TransactionDto accountCreateDto)
{
var commandModel = _mapper.Map<TransactionHistory>(accountCreateDto);
_transactionRepository.CreateTransaction(commandModel);
var accountReadDto = _mapper.Map<AccountReadDto>(commandModel);
return Ok();
}
在 transactionRepository 类中,我执行了以下操作:
private readonly TransactionContext _transContext;
public TransactionRp(TransactionContext tContext)
{
_transContext = tContext;
}
public async Task CreateTransaction(TransactionHistory transaction)
{
using(IDbContextTransaction transactionContext = _transContext.Database.BeginTransaction())
{
try
{
transaction.CreatedDate = DateTime.UtcNow;
_transContext.TransactionHistories.Add(transaction);
await _transContext.SaveChangesAsync();
var senderAccount = _transContext.Accounts.FirstOrDefault(x => x.AccountNo == transaction.AccountNo);
var receiverAccount = _transContext.Accounts.FirstOrDefault(x => x.AccountNo == transaction.ReceiverAccount);
senderAccount.Amount = senderAccount.Amount - transaction.Amount;
receiverAccount.Amount = senderAccount.Amount + transaction.Amount;
_transContext.Accounts.Update(receiverAccount);
_transContext.Accounts.Update(receiverAccount);
}
catch (Exception ex)
{
throw;
}
}
}
但是当我运行代码时,我在这一行得到一个错误
await _transContext.SaveChangesAsync();
错误是:
无法访问已释放的上下文实例。
此错误的常见原因是释放从依赖注入中解析的上下文实例,然后尝试在应用程序的其他地方使用相同的上下文实例。
如果您在上下文实例上调用“Dispose”或将其包装在 using 语句中,则可能会发生这种情况。如果你使用依赖注入,你应该让依赖注入容器负责处理上下文实例。对象名称:'TransactionContext'
更新
这就是我在 ConfigureServices 中管理上下文的方式
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TransactionContext>(opt => opt.UseSqlServer
(Configuration.GetConnectionString("BankConnection"))
);
}
【问题讨论】:
-
你没有展示 _transContext 是如何管理的。是 DI 吗?
-
@DavidBrowne-Microsoft 更新了代码,我是 .net 核心的新手。我想这就是你问的
-
为什么要首先使用 TransactionScope?如果您使用 EF Core 或类似的 ORM,则更改会被缓存,并且仅在请求结束时调用
SaveChanges时才会持久保存到数据库中。您不需要显式事务,DbContext 本身为您提供事务语义。如果您多次致电SaveChanges...不要。至少不是没有非常严重的原因 -
如果您想要分布式事务,.Net 核心不支持它们。顺便说一句,您不是在等待任务,这意味着无法保证实际处理操作的时间。 (可能是在初始通话结束后,这就是您收到已处理错误的原因。)
标签: c# asp.net-core asynchronous