19 Ağustos 2016 Cuma

EF Context'i güncellemek

Veritabanı bağlantısı için Entity Framework kullandığım bir web sayfasında garip bir problemle karşılaştım. SQL Server Management Studio ile veritabanına bağlanarak bir kaydı değiştirdiğimde, bu değişikliğin web sayfasına yansımadığını fark ettim. İnternet servis sağlayıcısına bu durumdan bahsedince onlar web sitesini kapatıp açtılar ve değişiklik web sitesine yansıdı. Uzun zamandır kafamı kurcalayan bu problemin çözümünü az önce buldum.

[1]

Entity Framework (EF), veritabanından getirdiği verinin bir kopyasını sunucu bilgisayarın hafızasında tutuyor ve bu kopyaya "EF Context" adı veriliyor. Eğer veritabanında EF dışında bir kaynak tarafından bir değişiklik yapılırsa EF bunu algılayamıyor. EF Context üzerinde bir değişiklik olmadığı sürece veritabanındaki veriler yerine EF Context içerisindeki veriler kullanılıyor. Benim karşılaştığım problem bundan kaynaklanıyormuş. Web sayfasını ilk açtığımda veritabanındaki veriler EF Context içerisine yazılıyor ve veritabanı üzerinde ben SQL Server Management Studio ile değişiklik yapsam bile bu değişiklik EF Context içerisindeki verilere yansımadığı için bu değişiklikler web sitesinde görünmüyormuş.

Bu problem EF uzmanları için kolay bir problem olabilir ama EF konusunda ben henüz yeni olduğum için yavaş yavaş öğreniyorum :)

Peki çözüm ne?

Çözüm, SQL Server Management Studio ile veya veritabanındaki bir Stored Procedure ile veritabanında değişiklik yapıldıktan sonra EF Context'in güncellenmesi... Bunun için aşağıdaki kod kullanılabilir:

public void RefreshAll()
{
     // Get all objects in statemanager with entityKey
     // (context.Refresh will throw an exception otherwise)
     var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(
                                                 EntityState.Deleted
                                               | EntityState.Modified
                                               | EntityState.Unchanged)
                                      where entry.EntityKey != null
                                      select entry.Entity);
 
     context.Refresh(RefreshMode.StoreWins, refreshableObjects);
}

Bu kodu https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/ adresinden aldım [2].

Kaynaklar:

[1] http://www.entityframeworktutorial.net/EntityFramework4.3/persistence-in-entity-framework.aspx

[2] https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/