实体框架和ObjectContext的线程安全
本文关键字:线程 安全 ObjectContext 框架 实体 | 更新日期: 2023-09-27 18:16:36
假设我们有一个带有一些实体的ObjectContext(通过实体框架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;
}
}