缓存实体-如何避免实体对象不能被IEntityChangeTracker的多个实例引用
本文关键字:实体 实例 引用 IEntityChangeTracker 不能 何避免 对象 缓存 | 更新日期: 2023-09-27 18:27:34
我想缓存我的实体,以尽可能避免数据库交互。当我做这样的事情时:
public IList<Website> Get()
{
//The `_cacheManager.Get` just retrieves the object from an `ObjectCache` instance based on key.
return _cacheManager.Get(CcCacheWebsiteAll, () => _websiteRepository.Table.ToList());
}
从缓存中检索值并将其分配给需要该类型实例的新对象时,我遇到了问题。
例如:
var store = new Store();
store.Name = "something";
store.Website = _websiteService.Get().FirstOrDefault();
_storeService.Insert(store);
//Where _storeService.Insert(store) is:
public void InsertStore(Store store)
{
_storeRepository.Insert(store); //THIS will raise the error
}
我本以为在Get()
方法上调用ToList()
会将实例放入一个新列表中并停止问题,但在测试时我没有发现这一点。
有人有什么建议吗?
注意:为了确保我只有一个上下文,我禁用了缓存,一切都按预期进行。
编辑
商店服务Ctor:
public StoreService(IRepository<Store> storeRepository)
{
_storeRepository = storeRepository;
}
网站服务Ctor:
public WebsiteService(IRepository<Website> websiteRepository)
{
_websiteRepository= websiteRepository;
}
您说过您有两个上下文。如果您使用一个上下文(让我们称之为上下文A)来加载实体,那么该实体将由上下文A跟踪。您不能将该实例与另一个上下文一起使用(上下文B)。因此,你必须将你的实体从上下文A中分离出来,并将你的主体附加到上下文B中。
随着Entity Framework的版本,将实体从上下文分离/附加到上下文的方法发生了一些变化,但对于EF6,我认为这篇文章和这个SO问题描述得很好。