实体框架无法查看其他会话的更新值

时间:2016-03-21 08:59:42

标签: c# oracle entity-framework

我使用EF 6.1.3和Oracle。有两个会话。在第一次会议中我无法查看 第二次会议的更新值。

using (var uow = new DmsUOW()
{
    var var1 = uow.RoleTypeRepository.Get(p => p.ID == 3).Single().NAME; // var1 = ADMIN5
    //I change my data ADMIN5-> ADMIN6 from other session(TOAD) and commit. 
    var var2 = uow.RoleTypeRepository.Get(p => p.ID == 3).Single().NAME; //var1 = ADMIN5 ---> WRONG!!! it must be ADMIN6
 }

存储库:

public class DmsUOW : UnityOfWorkEF
    {
        private ROLE_TYPE_Repository _roleTypeRepository;
        public ROLE_TYPE_Repository RoleTypeRepository
        {
            get { return _roleTypeRepository ?? (_roleTypeRepository = new ROLE_TYPE_Repository(this)); }
        }
    }

RepositoryEf类:

public class RepositoryEf<TEntity> :BaseRepositoryEf, IRepository<TEntity> where TEntity : class
{

    protected DbSet<TEntity> objectSet;

    public virtual IQueryable<TEntity> Get(Expression<Func<TEntity, bool>> expression)
    {
        return objectSet.Where(expression).AsQueryable<TEntity>();
    }
 }

myDbContext设置:

Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = false;
Configuration.ValidateOnSaveEnabled = false;

但是当我编写sql查询它工作正常:

using (var uow = new DmsUOW()
{
    var var1 = uow.RoleTypeRepository.GetMyQuery(3).Single().NAME;
    var var2 = uow.RoleTypeRepository.GetMyQuery(3).Single().NAME;
}

RoleTypeRepository:

public class ROLE_TYPE_Repository : RepositoryEf<ROLE_TYPE>
{
    public ROLE_TYPE_Repository(IUnityOfWork UnityOfWork) : base(UnityOfWork) { }

    public List<ROLE_TYPE> GetMyQuery(int? id)
    {
        return this.Query<ROLE_TYPE>("SELECT * FROM ROLE_TYPE WHERE id = :p1", new OracleParameter("p1", id)).ToList();
    }
}

1 个答案:

答案 0 :(得分:2)

是的,默认情况下DbContext缓存从数据库中读取它们的值(您将在DbContext.Set<EntityType>().Local集合中找到所有缓存的实例,而DbContext将检查在向数据库发出命令之前收集Local

您有几种选择:

  1. 使用新的DbContext实例。这应该是首选的方式... DbContext实例并不意味着长寿(如果使用工作单元模式,对于您的上下文变量名称,则使用时更少)
  2. 在使用之前从数据库中刷新实体:

    var var1 = uow.RoleTypeRepository.Get(p => p.ID == 3).Single().NAME;
    // Refresh before reading it
    uow.Entry(var1).Reload();
    var var2 = uow.RoleTypeRepository.Get(p => p.ID == 3).Single().NAME;
    
  3. 在再次阅读之前分离您的实体:

    var var1 = uow.RoleTypeRepository.Get(p => p.ID == 3).Single().NAME;
    // Detach before reading it
    ((IObjectContextAdapter)uow).ObjectContext.Detach(var1);
    var var2 = uow.RoleTypeRepository.Get(p => p.ID == 3).Single().NAME; 
    
  4. 不要跟踪您的实体,以免他们被缓存:

    var var1 = uow.RoleTypeRepository.AsNoTracking().Get(p => p.ID == 3).Single().NAME;
    // Something has changed the item
    var var2 = uow.RoleTypeRepository.AsNoTracking().Get(p => p.ID == 3).Single().NAME;