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

时间:2014-08-06 15:23:16

标签: c# database multithreading entity-framework thread-safety

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

1 个答案:

答案 0 :(得分:5)

是的,你可能还想考虑在你的ObjectSet上使用.AsNoTracking()从你的Context中删除任何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;
        }
    }