实体框架和ObjectContext的线程安全

本文关键字:线程 安全 ObjectContext 框架 实体 | 更新日期: 2023-09-27 18:16:36

假设我们有一个带有一些实体的ObjectContext(通过实体框架EDMX)。实体从一个线程从数据库中完全加载。只有在实体被加载之后,我们才会启动一些线程,这些线程只会从实体中读取数据,而不会对数据库进行查询。它是线程安全的操作吗?

实体框架和ObjectContext的线程安全

是的,你可能还想考虑在你的ObjectSets上使用. asnotracking()来从你的上下文中删除任何EF钩子,以确保你纯粹是在做你提到的读操作。使用.AsNoTracking()的另一个好处是,它还会增加一个非常小的性能提升

下面是一个如何在提供程序中做到这一点的示例:

    public class Provider<TEntity> where TEntity : class
    {
        protected IObjectSet<TEntity> _dbSet;
        protected ObjectContext _context;
        public Provider(ObjectContext context)
        {
            _context = context;
            _dbSet = context.CreateObjectSet<TEntity>();
        }
        public virtual IEnumerable<TEntity> FindReadOnly(Expression<Func<TEntity, bool>> whereClause= null)
        {
            IQueryable<TEntity> dbSet = _dbSet.AsNoTracking();
            if (whereClause!= null) 
                dbSet = dbSet.AsExpandable().Where(whereClause);
            return dbSet;
        }
    }