2010-04-01 33 views
10

Veritabanımdaki canlandırıcı nesnelerle ilgili sorun yaşıyorum. İki bilgisayarım ve iki uygulamam var.Entity Framework - nesneyi yenilemek nesneler

İlk bilgisayarda, veritabanımla iletişim kuran ve bazı verileri Ölçümler tablosuna ekleyen bir uygulama var. Diğer bilgisayarımda, bir zamanlayıcının altındaki En Son Ölçümü alan bir uygulama var, bu yüzden uygulamanın ilk PC'imde de eklemiş olduğu ölçümleri geri alması gerekiyor.

Sorun şu ki değil. Uygulamamın başlangıcında, veritabanından tüm verileri önbelleğe alır ve yeni veri eklemez. Önbelleğe alınan verilerden herhangi birini değiştirdiğimde iyi çalışan Refresh() yöntemini kullanıyorum, ancak yeni eklenen verileri yenilemiyor.

public static Entities myEntities = new Entities(); 

    public static Measurement GetLastMeasurement(int conditionId) 
    { 
     myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements); 

     return (from measurement in myEntities.Measurements 
       where measurement.ConditionId == conditionId 
       select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
    } 

dip not: Burada

verileri güncelleştirmek gerekir benim yöntemidir Uygulamalar, app.config dosyasında farklı bağlantı dizelerine sahiptir (aynı DB için farklı hesaplar).

+0

Burada http://stackoverflow.com/questions/1746941/objectcontext-refresh sen benim veritabanından yeni eklenen verileri alınamadı gelmez hala söz –

cevap

9

Bu çalışması gerekir: Eğer dükkanını Bunu kullanmak istediğiniz her seferinde yenilediğimde

public static Entities myEntities = new Entities(); 

public static Measurement GetLastMeasurement(int conditionId) 
{ 
    myEntities.Refresh(RefreshMode.StoreWins, myEntities.Measurements); 
    var allMeasurements = myEntities.Measurements.ToList();//retrieves all measurements from database 

    return (from measurement in allMeasurements 
      where measurement.ConditionId == conditionId 
      select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
} 

ne anlamı önbelleğe alma yapar? Aşağıdakileri yapabilirsiniz:

public Measurement GetLastMeasurement(int conditionId) 
{ 
    var entities = new Entities(); 
    return (from measurement in entities.Measurements 
      where measurement.ConditionId == conditionId 
      select measurement).OrderByDescending(cd => cd.Timestamp).First(); 
} 

Ayrıca her aramada veritabanına bakar, ancak çok daha az işlem yapar.

+0

İlk solüsyon cevabım kontrol edebilirsiniz bakın. Çalışacağım ikinci çözümün de işe yaramıyor. Bunu tercih etmem. Çünkü bu şekilde veritabanımda her zaman son ölçümü almak istediğim yeni bir içerik açıyorum. Uygulamamı yeniden başlattığımda, yeni verileri alır, ancak uygulama çalışırken eklenmiş bir şey varsa bu özellik geri gelmez. Her bir uygulama için kullandığım farklı hesapların (DB'den veri ekleyen ve ekleyen) bunun nedeni nedir? –

+0

@Nebo: İkinci çözüm çalışmıyor? Ne geri dönüyor? – LukLed

+0

Bu iki çözümden herhangi biri ile zaten sahip olduğum gibi aynı şeyi elde ediyorum. Ölçümler tablosundaki bir satırı düzenlerseniz (uygulama başlangıcında geri alınmıştır), güncelleştirir. Ancak yeni bir satır eklerseniz, onu geri almayacak. Her iki durumda da. Bu sefer SQL Manangement Studio'yu kullanarak mevcut ve yeni bir satır ekledim. –

8

EF 4.1'den itibaren varlıklarınızda AsNoTracking() yöntemini kullanabilirsiniz. AsNoTracking() izleme için bağlam varlık eklemek, ancak sadece veri deposundan taze onları geri dönmeyecek

return myEntities.Measurements.AsNoTracking(); 

Not. Daha fazla bilgi için

başka olasılık bir bağlamda nesneleri yönetmek istiyorum nasıl karar MergeOption kullanmaktır http://blogs.msdn.com/b/adonet/archive/2011/02/05/using-dbcontext-in-ef-feature-ctp5-part-11-load-and-asnotracking.aspx