【问题标题】:Entity Framework and Thread safety of ObjectContextObjectContext 的实体框架和线程安全
【发布时间】:2018-09-29 06:11:48
【问题描述】:

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

【问题讨论】:

  • 如果您确保它已全部预加载并且您真的在读取实体...当然。

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


【解决方案1】:

是的,您可能还需要考虑在您的 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;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多