实体框架和ObjectContext的线程安全性

5

假设我们有一个ObjectContext(通过Entity Framework EDMX)和一些实体。实体是从单个线程中完全加载的。只有在实体被加载后,我们才启动一些将仅从实体读取数据且没有对数据库进行查询的线程。这是线程安全操作吗?


如果您确保所有实体都已预加载,并且您只是进行实体的读取……那当然可以。 - Luaan
1个回答

5

是的,你可能还想考虑在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;
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接