2011-10-11 149 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

这是否意味着您需要在缓存之前完成对象的使用? –