Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架无法查看其他会话的更新值_C#_Oracle_Entity Framework - Fatal编程技术网

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

C# 实体框架无法查看其他会话的更新值,c#,oracle,entity-framework,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 commi

我使用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>();
    }
 }
但当我编写sql查询时,它工作得很好:

using (var uow = new DmsUOW()
{
    var var1 = uow.RoleTypeRepository.GetMyQuery(3).Single().NAME;
    var var2 = uow.RoleTypeRepository.GetMyQuery(3).Single().NAME;
}
角色定位:

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();
    }
}
公共类角色\u类型\u存储库:RepositoryEf
{
公共角色类型存储库(IUnityOfWork UnityOfWork):基本(UnityOfWork){}
公共列表GetMyQuery(int?id)
{
返回这个.Query(“SELECT*FROM ROLE_TYPE,其中id=:p1”,new OracleParameter(“p1”,id)).ToList();
}
}

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

您有几个选择:

  • 使用新的
    DbContext
    实例。这应该是首选的方式
    DbContext
    实例并不意味着是长期存在的(如果您使用工作单元模式,就更不用说了,您正在使用工作单元模式作为上下文变量名)
  • 使用前从数据库刷新实体:

    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;
    
  • 在再次读取实体之前先分离实体:

    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; 
    
  • 不要跟踪实体,以免它们被缓存:

    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; 
    

  • 杰出的我选了4个。此外,它甚至还缓存了将查询发送到DB的值。我们跟踪了会话查询。为什么会这样?顺便问一下,AsNoTracking没有找到方法吗?我如何实现它?公共虚拟tenty GetByID(objectid){return objectSet.AsNoTracking().Find(id);}@AdemAyg出于性能原因:向存储/数据库发送查询(通常)比只检查内存中的集合要昂贵得多。此外,它甚至会缓存将查询发送到数据库的值。我们跟踪了会话查询。为什么会这样?2.问题:AsNoTracking没有找到方法吗?我如何实现它?public virtual TEntity GetByID(objectid){return objectSet.AsNoTracking().Find(id);}–@JclUsing
    AsNoTracking()
    不应缓存实体(如果缓存了,则说明有问题,或者您正在其他未使用
    AsNoTracking()
    的地方读取实体)。对于本例中的
    Find
    ,可以像
    returnobjectset.AsNoTracking().FirstOrDefault(x=>x.ID==ID)一样实现它
    
    
    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;