2011-10-11 148 views
2

我使用EF代碼第一次下面的僞代碼:EF代碼優先和緩存

User user = GetFromCache(); 

Playlist playlist = new Playlist { Name = "name", User = user }; 

playlistRepository.Add(playlist); 

unitOfWork.Commit(); 

的GetFromCache()方法會檢查用戶是否在緩存中,如果不是它使用存儲庫得到它來自數據庫。如果它在緩存中,則返回它。

當我第一次運行此代碼時一切正常。當我第二次運行它時,它從緩存中提取用戶我得到一個異常:一個實體對象不能被多個IEntityChangeTracker實例引用。

這是爲什麼?

回答

1

由上下文創建的實體保留對該上下文的引用以用於延遲加載和更改跟蹤目的。如果你打算緩存一個實體,你可以通過分離去除對該上下文的引用(因爲在實體沒有其他引用之前,副作用上下文不會被GCed)。

所以,如果你要緩存鬆脫,它如下

context.Entry(user).State = EntityState.Detached; 

內。然後你GetFromCache()你需要的實體附加到當前上下文。否則,EF將爲該用戶對象插入一條新記錄。

User GetFromCache() 
{ 
    var user = /* retrieve from cache */ 
    if (user != null) 
    { 
     context.Users.Attach(user); 
    } 
    else 
    { 
     //get user from database 
    } 

    return user;  
} 
+0

這是否意味着您需要在緩存之前完成對象的使用? –