[英]How to work with cached Entity Framework data
我目前正在使用Entity Framework,並且需要管理以下場景,但是由於幕后發生了很多事情,因此我不確定是否最好的方法是什么,並且Googling到目前為止尚未提供必要的答案。
我在產品/供應商樣式數據庫中大約有100種產品。 由於小部件等,每個頁面上大約有10個表被多次使用。
我目前緩存結果(這100種產品)以及其他核心實體,以便執行大約80%的查詢。
但是,我有時會需要訪問擴展數據。 假設產品功能-它們僅顯示在產品頁面上-因此可以根據需要進行訪問,而不必永久緩存。 這是我的想法,請多多關照。
簡單但可能最糟糕的答案是將它們與原始實體一起放入緩存。 盡管數據不會太笨拙,但會對緩存的數據大小產生重大影響。
我可以查詢我需要的產品的緩存對象,然后重新附加到數據庫。 我不確定這個背后的機制,因為我是從一個緩存的實體開始的,它可能很快變得非常混亂。
我可以只查詢所需的產品,並按需提供所有其他數據。 這將涉及查詢相當多的表,但僅涉及單個產品,10個產品詳細信息行,10個功能行等。
所有意見和建議表示贊賞。
當我緩存值時,我總是使用AsNoTracking()從EF上下文中分離這些值。
有關應緩存多少信息的問題取決於訪問頻率和如果不存在則檢索信息的成本。 我通常使用.NET或Azure提供的緩存方法,因為它們會跟蹤內存消耗情況,並且如果長時間不訪問,則會導致條目被卸載。 關於msdn的一篇稍舊的文章解釋了ASP.NET緩存機制相當不錯。
我通常使用抽象類來隱藏緩存詳細信息,並使用特定類型的具體實現:
public sealed class CustomerIdCache : AbstractCache<CustomerIdCache, Customer>
{
private CustomerIdCache()
{
}
/// <summary>
///
/// </summary>
/// <returns></returns>
protected override TimeSpan GetExpiration()
{
return new TimeSpan(0, 1, 0, 0);
}
/// <summary>
///
/// </summary>
/// <param name="db"></param>
/// <param name="key"></param>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
protected override Customer GetSingleElement(ITimeJackContext db, object[] key)
{
Guid id = (Guid)key[0];
Customer customer = db.Customers.AsNoTracking().SingleOrDefault(x => x.Id == id);
return customer;
}
/// <summary>
///
/// </summary>
/// <param name="entry"></param>
/// <returns></returns>
protected override IEnumerable<object> GetKey(Customer entry)
{
return new object[] { entry.Id };
}
用法:
從緩存中檢索信息(如果不存在,將從數據庫中加載)
Guid CustomerID = ...; Customer customer = CustomerIdCache.Instance.Get(Db, new[] { (object)CustomerId });
更新數據庫后使緩存信息無效
CustomerIdCache.Instance.Invalidate(customer);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.