Ef code first EF代码优先和缓存

Ef code first EF代码优先和缓存,ef-code-first,Ef Code First,我首先使用EF代码编写了以下伪代码: User user = GetFromCache(); Playlist playlist = new Playlist { Name = "name", User = user }; playlistRepository.Add(playlist); unitOfWork.Commit(); GetFromCache()方法检查用户是否在缓存中,如果不是,则使用存储库从数据库中获取。如果它在缓存中,它将返回它 当我第一次运行这段代码时,一切都很好。

我首先使用EF代码编写了以下伪代码:

User user = GetFromCache();

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

playlistRepository.Add(playlist);

unitOfWork.Commit();
GetFromCache()方法检查用户是否在缓存中,如果不是,则使用存储库从数据库中获取。如果它在缓存中,它将返回它

当我第一次运行这段代码时,一切都很好。当我第二次运行它并且它从缓存中获取用户时,我得到一个异常:entity对象不能被多个IEntityChangeTracker实例引用


为什么会这样?

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

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

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

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