EF Code First和缓存

时间:2011-10-11 23:16:14

标签: ef-code-first

我有使用EF Code First的以下伪代码:

User user = GetFromCache();

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

playlistRepository.Add(playlist);

unitOfWork.Commit();

GetFromCache()方法检查用户是否在缓存中,如果没有,则使用存储库从数据库中获取它。如果它在缓存中,则返回它。

当我第一次运行此代码时,一切都很好。当我第二次运行它并从缓存中获取用户时,我得到一个异常:IEntityChangeTracker的多个实例无法引用实体对象。

为什么?

1 个答案:

答案 0 :(得分:1)

由上下文创建的实体保留对该上下文的引用,以用于延迟加载和更改跟踪目的。如果要缓存实体,则通过分离它来删除对该上下文的引用(因为在实体没有其他引用之前,副作用上下文不会被GC)。

因此,如果您要缓存它,请按以下方式分离

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;    
}