C# ObjectContext的实体框架与线程安全

C# ObjectContext的实体框架与线程安全,c#,database,multithreading,entity-framework,thread-safety,C#,Database,Multithreading,Entity Framework,Thread Safety,假设我们有一个ObjectContext(通过实体框架EDMX)和一些实体。从一个线程从数据库中完全加载的实体。只有在加载实体之后,我们才会启动一些线程,这些线程只从实体读取数据,而不会查询数据库。它是线程安全操作吗 > P>是的,您可能还想在ObjutsOffice上使用.asNoTrkAccess()来从上下文中移除任何EF钩子,以确保您完全按照所提及的进行读取操作。使用.AsNoTracking()的另一个好处是,它还将增加非常小的性能提升 下面是一个如何在提供程序中执行此操作的示例:

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

> P>是的,您可能还想在ObjutsOffice上使用.asNoTrkAccess()来从上下文中移除任何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;
        }
    }
公共类提供程序,其中tenty:class
{
受保护的IObjectSet\u dbSet;
受保护的ObjectContext\u上下文;
公共提供程序(ObjectContext上下文)
{
_上下文=上下文;
_dbSet=context.CreateObjectSet();
}
公共虚拟IEnumerable FindReadOnly(表达式whereClause=null)
{
IQueryable dbSet=_dbSet.AsNoTracking();
if(whereClause!=null)
dbSet=dbSet.AsExpandable().Where(Where子句);
返回dbSet;
}
}

如果您确保所有内容都已预加载,并且您实际上只读取实体。。。当然