gpt4 book ai didi

c# - 将当前事务传递给 DbCommand

转载 作者:太空狗 更新时间:2023-10-29 21:16:08 32 4
gpt4 key购买 nike

我正在开发一个使用 ASP.NET Core 2.1 和 EF Core 2.1 的项目。虽然大部分查询和命令使用EF,但有些单元需要直接调用存储过程。

我不能使用FromSql,因为它需要基于实体模型的结果集。

假设我们有这些方法:

public Task CommandOne(DbContext context)
{
Entity entity = new Entity
{
Name = "Name"
};

context.DbSet<Entity>().Add(entity);

return context.SaveChangesAsync();
}

public async Task CommandTwo(DbContext context)
{
DbCommand command = context.Database.GetDbConnection().CreateCommand();
command.CommandText = "storedProcName";
command.CommandType = System.Data.CommandType.StoredProcedure;

using (var reader = await command.ExecuteReaderAsync().ConfigureAwait(false))
{
// read result sets
}
}

如果我像这样在一个事务中调用这两个命令:

public async Task UnitOfWork(DbContext dbContext)
{
using (var transaction = await dbContext.Database.BeginTransactionAsync())
{
await CommandOne(dbContext);
await CommandTwo(dbContext);
}
}

发生此异常:

BeginExecuteReader requires the command to have a transaction when theconnection assigned to the command is in a pending local transaction.The Transaction property of the command has not been initialized.

我不得不说,它并不像 command.Transaction = ... 那样简单。这需要不同于 EF 使用的事务的 DbTransaction

我已经坚持了一个月!

有解决办法吗?

非常感谢。

最佳答案

I have to mention, it's not as simple as command.Transaction = .... This requires DbTransaction which differs from the transaction EF uses.

原来如此。您只需要引用Microsoft.EntityFrameworkCore.Relational 程序集并添加

using Microsoft.EntityFrameworkCore.Storage;

访问GetDbTransaction扩展方法:

command.Transaction = context.Database.CurrentTransaction?.GetDbTransaction();

关于c# - 将当前事务传递给 DbCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52352636/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com