2016-03-21 14 views
1

EF 6.1.3 ve Oracle kullanıyorum. İki seans var. İlk oturumda ikinci oturumun güncellenmiş değerlerini görüntüleyemiyorum.Entity Framework, diğer oturumların güncelleştirilmiş değerlerini göremiyor

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 
} 

Depo:

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

RepositoryEf sınıfı:

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 ayarları:

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

Ama sql sorgusu yazarken iyi çalışır:

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(); 
    } 
} 

cevap

2

Evet, varsayılan değerlerini bir DbContext önbelleğe onlar veritabanından okunur (eğer DbContext.Set<EntityType>().Local koleksiyonundaki tüm önbelleğe örneklerini bulacaksınız ve DbContext kontrol edecek

: Local toplama veritabanı)

bir komut vermeden önce, birkaç seçeneğiniz var

  • Yeni bir DbContext örneği kullanın. Tercih edilen yol bu olmalıdır ... DbContext örnekleri uzun ömürlü değildir (bağlam değişkeni adınız için iş birimi desenini kullanırsanız daha az kullanırsınız)
  • Yenile kullanmadan önce veritabanından varlık:

    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; 
    
  • tekrar okumadan önce varlığınızı ayırın:

    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; 
    
  • senin varlıkları izlemek etmeyin onlar önbelleğe alma kalmamak:

  • +0

    Mükemmel. 4. 'u seçtim Ayrıca, sorguyu DB'ye gönderdiği değerleri önbelleğe alır. Oturum sorgularını takip ettik. Neden böyle yapıyor? AsNoTracking yolunda Find yöntemi yok mu? Bunu nasıl uygulayabilirim? Genel sanal TEntity GetByID (nesne kimliği) { return objectSet.AsNoTracking() Find (id); } –

    +0

    @AdemAyg performans nedeniyle: mağaza/veritabanına bir sorgu gönderimi (genellikle) bir bellek içi koleksiyonunu kontrol etmekten çok daha pahalı. – Jcl

    +0

    Ayrıca, sorguyu DB'ye gönderdiği değerleri önbelleğe alır. Oturum sorgularını takip ettik. Neden böyle yapıyor? 2.question: AsNoTracking'in Find yöntemine sahip olmadığı yol mu? Bunu nasıl uygulayabilirim? genel sanal TEntity GetByID (nesne kimliği) {return objectSet.AsNoTracking(). } - @Jcl –