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