缓存实体 - 如何避免IEntityChangeTracker的多个实例无法引用实体对象

时间:2014-10-23 20:37:28

标签: c# asp.net-mvc entity-framework entity-framework-6

我想缓存我的实体以尽可能避免数据库交互。当我做类似的事情时:

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
}

我原以为在ToList()方法上调用Get()会将实例放入新列表并停止发布,但我在测试时却没有找到。

有人有任何建议吗?

注意:为了确保我只有一个上下文,我禁用了缓存,一切都按预期工作。

修改

Store Service Ctor:

public StoreService(IRepository<Store> storeRepository)
{
    _storeRepository = storeRepository;
}

网站服务Ctor:

public WebsiteService(IRepository<Website> websiteRepository)
{
    _websiteRepository= websiteRepository;
}

1 个答案:

答案 0 :(得分:1)

你说你有两种情境。如果您使用一个上下文(让我们称之为上下文A)来加载您的实体,那么该实体将由上下文A跟踪。您不能将该实例与另一个上下文(上下文B)一起使用。因此,您必须将您的实体与上下文A分离,并将您的实体附加到上下文B。

从/向上下文分离/附加实体的方法已经改变了实体框架的版本,但对于EF6,我认为this articlethis SO question描述得很好。