2011-09-13 87 views
0

我一遍又一遍地提到:編寫代碼來創建需要填充的子關聯(即FK引用)的實體實例(即將行填充到數據庫中)。如何爲EF實體類型實施(乾淨地)緩存?

示例:

namespace EomApp1.Formss.AB2.Model 
{ 
    public class UnitConversionSource : EomApp1.Formss.AB2.Model.IUnitConversionSource 
    { 
     IEnumerable<UnitConversion> IUnitConversionSource.UnitConversions(DirectAgentsEntities model) 
     { 
      yield return new UnitConversion 
      { 
       Coefficient = 1, 
       FromUnit = model.Units.First(c => c.Name == "USD"), 
       ToUnit = model.Units.First(c => c.Name == "USD"), 
       DateSpan = new DateSpan 
       { 
        FromDate = DateTime.Now, 
        ToDate = DateTime.Now.Add(TimeSpan.FromHours(1)) 
       } 
      }; 
     } 
    } 
} 

希望的:在給定的有效期限的第一執行(比如說10秒)model.Units.First(c => c.Name == "USD")執行時,該實體是取出從數據庫中,但隨後(有效期限內)來自一個存儲器高速緩存中。

目標:防止循環插入一百萬行,使相同的選擇查詢一百萬次。

我很感興趣,特別是在一個非侵入性解決方案中,它不影響我在示例中編寫代碼的方式。這是(希望)本着建築立場關注分離的最佳實踐精神。

(PS:我不知道,如果我使用術語非侵入性的是標準的語義 - 讓我知道,如果有更好的方法來prase本)

回答

0

我不知道是什麼點你的代碼,但它具有明顯的和正確解決方案:

IEnumerable<UnitConversion> IUnitConversionSource.UnitConversions(DirectAgentsEntities model) 
    { 
     string unit = model.Units.First(c => c.Name == "USD"); 

     yield return new UnitConversion 
     { 
      Coefficient = 1, 
      FromUnit = unit, 
      ToUnit = unit, 
      DateSpan = new DateSpan 
      { 
       FromDate = DateTime.Now, 
       ToDate = DateTime.Now.Add(TimeSpan.FromHours(1)) 
      } 
     }; 
    } 

如果你知道你必須經常使用的一些值是內給他們取到了一些解釋和處理其一生你們還是正確的方法一些緩存API。

如果出現更復雜的情況,您可以使用EF Caching Provider,但在這種解決方案中,您的查詢必須仍然被解析,散列必須被計算等等,所以對於您的場景,將所有單元預加載到字典看起來更好。

+0

你對於不確定問題的評論 - 你的意思是你無法想象它會永遠存在於任何環境中,我應該首先問自己我做錯了什麼? –