我在我的網站上預加載產品數據,因爲我需要這個快速訪問,並且寧願在應用程序啓動時加載一次,而不僅僅是當這是要求。這是確保加載速度快的一種方法。我通過將我的產品實體與其他一些實體一起加載並將它們存儲在內存中來做到這一點。當你不再有上下文引用時如何從上下文中分離實體
我再有類似以下內容檢索我的數據:
public override IEnumerable<Product> Get()
{
var result = _cacheManager.Get(PreLoadCacheKey) as IEnumerable<Product>;
if (result != null)
return result;
return base.Get();
}
我現在面臨的問題是,我使用依賴注入,我無法控制我的數據上下文的範圍比(其它將其設置爲InstancePerRequest()並保留它),因此當我緩存我的實體時,它們仍然具有對原始上下文的引用。
我已經試過各種事情,但似乎無法避開的問題:
The relationship between the two objects cannot be defined because they are attached to different ObjectContext objects.
試圖附加從緩存中檢索到一個新的實體,我加入到數據庫中的實體時。
事情我已經嘗試:
- 使用
AsNoTracking()
- 通過所有的結果循環檢索數據將它們添加到緩存和
Detach
從當前上下文荷蘭國際集團他們然後將它們連接到新的上下文之前從緩存中檢索。
理想情況下,我希望能夠從實體側面的實體中分離上下文,以便我可以看到實體是否附加到當前上下文,如果沒有,則將它從舊的一個並附加到新的。然而,從我所看到的,只有你可以將它分離出來,是通過參考我不會有的舊背景。
我錯過了一些明顯的東西嗎?
編輯
這是一個例子,我想實體連接到另一個背景:
var orderLine = order.Lines.FirstOrDefault(ol => ol.Product.Id == product.Id) ?? new SalesOrderLine();
orderLine.Price = price.Price;
orderLine.Product = product; //This is my cache'd entity.
orderLine.ProductPriceType = price.ProductPriceType;
orderLine.Quantity += qty;
order.Customer = customer;
order.Lines.Add(orderLine);
order.Status = SalesOrderStatus.Current;
Update(order);
SaveChanges();
由於它矗立在那一刻,我強行加載未緩存的版本來解決這個問題。
請在出現此異常的位置顯示代碼。你在哪裏把一個'Product'與另一個實體聯繫起來? – 2014-12-06 20:08:09
@GertArnold完成。 – webnoob 2014-12-06 20:11:34