假设我们有一个ObjectContext(通过Entity Framework EDMX)和一些实体。实体是从单个线程中完全加载的。只有在实体被加载后,我们才启动一些将仅从实体读取数据且没有对数据库进行查询的线程。这是线程安全操作吗?
假设我们有一个ObjectContext(通过Entity Framework EDMX)和一些实体。实体是从单个线程中完全加载的。只有在实体被加载后,我们才启动一些将仅从实体读取数据且没有对数据库进行查询的线程。这是线程安全操作吗?
是的,你可能还想考虑在ObjectSets上使用.AsNoTracking()方法,以删除任何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;
}
}