C# 实体框架无法查看其他会话的更新值
我使用EF 6.1.3和Oracle。有两个会议。在第一个会话中,我无法查看 第二个会话的更新值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
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;