假设我们有一个带有某些实体的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# - Entity Framework 和ObjectContext的线程安全,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25164259/