c# - ObjectContext的 Entity Framework 和线程安全

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

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

最佳答案

是的,您可能还想考虑在您的 ObjectSet 上使用 .AsNoTracking() 来从您的上下文中删除任何 EF Hook ,以确保您只是像您提到的那样执行读取操作。使用 .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;
        }
    }

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

相关文章:

c# - UserControl 将 GridView 导出为 PDF

使用 UNION/UNION ALL 和 Group By 的 MySQL 查询错误

c# - 获取 C# 中链接的外键表的值

c - Pthread 运行时错误

c# - 同步调用(通过调度程序)或直接调用的调用

C# 可以隐藏继承的接口(interface)吗?

c# - Windows 8 商店 - 调试从商店下载的应用程序

java - 通过jsp页面将表单数据插入到数据库中两个不同的表中

python - 在线程中调用 run 以外的方法

c# - 如何将对象列表转换或转换为对象队列