C# EF6 DBContext扩展方法,线程安全

C# EF6 DBContext扩展方法,线程安全,c#,entity-framework,C#,Entity Framework,我有一个使用扩展方法的DBContext助手类: public static class DBContextHelper { public static async Task<T> FindAsync<T>( this DBContext context, Expression<Func<T, bool>> match) where T : BaseEntity {

我有一个使用扩展方法的DBContext助手类:

public static class DBContextHelper
{
    public static async Task<T> FindAsync<T>(
        this DBContext context, 
        Expression<Func<T, bool>> match) 
        where T : BaseEntity
    {
        return await context.Set<T>().SingleOrDefaultAsync(match);
    }
}
公共静态类DBContextHelper
{
公共静态异步任务FindAsync(
在这种背景下,
表达式匹配)
其中T:BaseEntity
{
返回wait context.Set().SingleOrDefaultAsync(匹配);
}
}

扩展方法是否不适合这种情况,因为它们可能被不同的线程访问而导致问题?

扩展方法可能是线程安全的,也可能是线程不安全的,具体取决于您编写它们的方式

当从不同的线程访问每个
DbContext
时,您的方法是线程安全的。这是合理的限制,因为
DbContext
不是真正的线程安全类。(启用此选项可以删除此限制,但这不是一个好的决策原因
DbContext

为单个业务操作创建
DbContext
,并立即对其进行处理是一种很好的做法—这是最重要的

F.e.在Web API场景中,您可以为每个HTTP请求创建不同的
DbContext
,甚至可以为每个操作创建不同的上下文:

public class UserRepository : IUserRepository
{
    public User async GetByIdAsync(int id)
    {
        using (var dbContext = new MyDbContext())
        {
            var data = await dbContext.FindAsync((UserData user) => user.Id == id);

            return new User(data);
        }
    }
}
方法
FindAsync
在此代码中正常工作,但调用起来并不方便。我会更改签名:

public static class DBSetHelper
{
    public static async Task<T> FindAsync<T>(
        this DbSet<T> set, 
        Expression<Func<T, bool>> match) 
        where T : BaseEntity
    {
        return await set.SingleOrDefaultAsync(match);
    }
}

. . .

public class UserRepository : IUserRepository
{
    public User async GetByIdAsync(int id)
    {
        using (var dbContext = new MyDbContext())
        {
            var data = await dbContext.Users.FindAsync(user => user.Id == id);

            return new User(data);
        }
    }
}
公共静态类DBSetHelper
{
公共静态异步任务FindAsync(
这个DbSet集合,
表达式匹配)
其中T:BaseEntity
{
返回等待集。SingleOrDefaultAsync(匹配);
}
}
. . .
公共类UserRepository:IUserRepository
{
公共用户异步GetByIdAsync(int id)
{
使用(var dbContext=new MyDbContext())
{
var data=await dbContext.Users.FindAsync(user=>user.Id==Id);
返回新用户(数据);
}
}
}