繁体   English   中英

EF Core 3.1 在 DbContext 中设置默认 IsolationLevel

[英]EF Core 3.1 set default IsolationLevel in DbContext

我需要将相同的 IsolationLevel 应用于 DbContext 执行的所有操作,因此我不必每次使用时都指定它。 有什么办法吗?

我正在使用 EF Core 3.1 和 SqlServer

更新:经过一些研究和测试,我发现我正在寻找的是将WITH (NOLOCK)应用于表。 此外,我尝试将事务 scope 应用于单个查询,并尝试从锁定的表中读取数据,但它不起作用。

这是我使用的代码:

using var transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted });

// query execution

transactionScope.Complete();

此代码已复制自: https://docs.microsoft.com/en-gb/ef/core/saving/transactions ,唯一的区别在于 IsolationLevel。

https://stackoverflow.com/a/53082098/12919581

我有这个我能找到的最好的解决方案,即使在我看来还不够好。

它会生成此警告,可能会为将来的更新带来一些问题。

Microsoft.EntityFrameworkCore.SqlServer.Query.Internal.SqlServerQuerySqlGenerator is an internal API that supports the Entity Framework Core infrastructure and not subject to the same compatibility standards as public APIs. It may be changed or removed without notice in any release.

我没有采用它,但目前这是我能找到的在不锁定任何表的情况下达到读取未提交数据的目标的唯一方法。

EF Core 是一个 ORM 可以针对多个数据源运行,并非所有数据源都会更改事务隔离级别,因此,在 EF 中此属性是只读的。 如果您想为 SQL 服务器更改它,您需要在您的 T-Sql 代码中进行。

您应该在 Dotnet 核心中间件的责任链中执行此操作。 每次action执行前,可以启动一个事务scope并设置事务隔离级别,在action执行后结束。 在此处查看中间件和 dotnet 管道:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
       app.Use(async (context, next) =>
       {
           //begin your transaction scope.
           await next.Invoke();
           //finalize the corresponding scope.
       });
    }
 }

这种模式与工作单元实现非常相似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM