gpt4 book ai didi

c# - Entity Framework 核心线程安全吗?

转载 作者:太空狗 更新时间:2023-10-30 01:30:45 27 4
gpt4 key购买 nike

我关注 Generic Repository Pattern in ASP.NET Core ,但在 IRepository 上,我使用 IQueryable 而不是 IEnumerable:

public  interface IRepository<T> where T: BaseEntity
{
IQueryable<T> Table { get; }
IEnumerable<T> TableNoTracking { get; }
T Get(long id);
void Insert(T entity);
void Update(T entity);
void Delete(T entity);
}

和实现类:

    public class EFRepository<T> : IRepository<T> where T : BaseEntity
{
private readonly ApplicationDbContext _ctx;
private DbSet<T> entities;
string errorMessage = string.Empty;

public EFRepository(ApplicationDbContext context)
{
this._ctx = context;
entities = context.Set<T>();
}

public virtual IQueryable<T> Table => this.entities;
}

服务类:

public class MovieService : IMovieService
{
private readonly IRepository<MovieItem> _repoMovie;

public MovieService(IRepository<MovieItem> repoMovie)
{
_repoMovie = repoMovie;
}

public async Task<PaginatedList<MovieItem>> GetAllMovies(int pageIndex = 0, int pageSize = int.MaxValue,
IEnumerable<int> categoryIds = null)
{
var query = _repoMovie.Table;

if (categoryIds != null)
{
query = from m in query
where categoryIds.Contains(m.CategoryId)
select m;
}

return await PaginatedList<MovieItem>.CreateAsync(query, pageIndex, pageSize);
}
}

在 Startup.cs 上:

  public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

services.AddMvc();
services.AddScoped(typeof(IRepository<>), typeof(EFRepository<>));
services.AddTransient<IMovieService, MovieService>();
services.AddTransient<ICategoryService, CategoryService>();
}

这段代码抛出一个错误:

InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.

如果我在 IRepository 上切换回 IEnumerable,那么它运行正常。

知道如何让它与 IQueryable 一起工作,使 EF Core 以正确的方式运行吗?

query = from m in query
where categoryIds.Contains(m.CategoryId)
select m;

最佳答案

Entity Framework DbContext 不是线程安全的。你一次只能执行一个查询,否则你会像上面那样得到一个异常。

我想您在同一个请求期间并行使用我们的存储库多次,这就是您得到异常的原因。如果您不为每个请求创建一个事务,您可以简单地使存储库成为 transient 的。在这种情况下,将为您的每个服务实例创建新的存储库,您将避免并发问题。

关于c# - Entity Framework 核心线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43424674/

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