2011-05-05 31 views
7

Ben EF4'ü POCO/depoları kullanan bir MVC3 uygulaması vardır güncellendi. Bir öğe kullanıcı tarafından web sitesinde açıldığında, veritabanında işaretlenir. Daha fazla 'x' saniye için işaretlenmiş olan öğeleri kontrol edip bunları kaldırmayı kontrol eden bir arka uç hizmeti var. Çalıştığım sorun, arka uç hizmetimde sorduğum sorguyu işaretli öğeleri buluyormuş gibi görünüyor, ancak işaretli öğe için tek tek öğeyi kontrol ettiğimde yenilenmiyor. EF4'ü - tazelenmiş almıyorum Veri/

İşte bayraklı öğeler

var list = Context.Transactions 
      .Where(t => t.Locked).ToList() ; 

list.Count() için doğru numarayı döndürür arar benim kodudur. Ama ben 't.Locked = false

Ben bu listeyi yinelemeye başladığımda SQL profiler'ı çalıştırdığımda yukarıdaki kod verileri için veritabanından doğru bir şekilde alındığını görebiliyorum. EF'yi doğru kullanmadığım için bu önbellekleme veya kimlik haritası sorunu mu?

cevap

12

Dikkatlice okuyun this answer. Bundan sonra uygulamanızı her istek için (web durumunda) yeni bir bağlam ve arka uç hizmetindeki her bir olay için yeni bağlam kullanacak şekilde yeniden düzenlemenizi öneririm.

EF kimlik haritası desen kullanır. Varlık içeriğe yüklendiğinde, varsayılan olarak her zaman yeni sorgudan döndürülen verilere rağmen aynı örneği aynı değerlere sahip olacaksınız. EF'i varlığı yenilemeye zorlamanın yolları vardır, ancak çoğunlukla bazı eşzamanlılık sorunlarını çözmek içindir.

hala uygulama ferahlatıcı değerleri zorlamak için kullanabilir değiştirmeye mahkum değilseniz:

var query = (ObjectQuery)(yourLinqQuery); 
query.MergeOption = MergeOption.OverwriteChanges; 
// Now iterate/execute query 
İlgili konular