2014-02-11 77 views
0

我有一個實體框架生成CodeModel。 (數據庫第一)。 所有這些都是數據庫中的視圖。 public class TypeCode { public string Code; 公共字符串描述 } 公共類TypeCode1 { 公共字符串的代碼; 公共字符串描述 }從數據庫加載大數據集。實體框架數據庫第一

每次應用程序打開時,我們都從Views中加載這些代碼。這隻需要一些時間(3分鐘),只是爲了加載一些初始化數據(每次應用程序打開時)。我有這樣的1000,這些類型碼類型 - TypeCode1,TypeCode2..All的的TypeCodes具有相同的結構代碼,描述

這是我們如何加載codeslist

using(SQlEntitiesContext _context = new SQlEntitiesContext()) 
{ 
TypeCodes = _context.TypeCode.ToList(); 
TypeCodes1 = _context.TypeCode1.ToList();..... 
.. 
.. 
.. 
} 

我想建立一個web服務它可以加載所有這些列表(它們不會更改),並在應用程序的每個實例需要時使用它們。最好不要查詢應用程序的每個實例的DB。 Webservice會做更多的事情,而不僅僅是Codes.It將加載和緩存所有的代碼開始。 目前,它需要因爲網絡

於是我開始了wcfService這樣

public interface ICodesService 
    { 
     [OperationContract] 
      Codes LoadCodeData(); 
    } 
    [Serializable] 
     [DataContract] 
     public class Codes 
     { 
      [DataMember] 
      public List<TypeCode> TypeCodes{ get; set; } 
      [DataMember] 
      public List<TypeCode1> TypeCodes1{ get; set; } 
    } 
    } 

LoadCodes.svc 


    public class LoadCodesService : ICodesService 
     { 
      Codes _AllCodes = new Codes(); 
     public Codes LoadCodeData() 
      { 

       using (CodeEntities _codes = new CodeEntities()) 
       { 

        _AllCodes.TypeCodes= _codes.TypeCode.ToList(); 
        _AllCodes.TypeCodes1= _codes.TypeCodes.ToList(); 
      } 
     } 

在客戶端的長

private void button1_Click(object sender, EventArgs e) 
     { 
      LoadCodesServiceReference.CodesServiceClient proxy = new LoadCodesServiceReference.CodesServiceClient(); 
      _codes = proxy.LoadCodeData(); 


     } 

我想知道,如果讓這些對象的靜態會是個好主意。對於正在加載的應用程序的每個實例。我們可以以某種方式緩存現有代碼並在需要時重用。什麼是可用的選項?使用DataReader不是一個選項。

+0

這聽起來像你想在WCF,這不是實體框架涉及到使用緩存。您可以在這裏找到您的答案:http://msdn.microsoft.com/en-us/library/ee230443%28v=vs.100%29.aspx – Olaf

回答

0

我認爲,關於創建你的類型在第一時間從數據庫中查詢自己的狀態,但此後對其進行緩存,並返回你的緩存,而不是數據庫的調用水合對象的靜態工廠方法。您可以將緩存邏輯放在那裏,然後放在工廠方法後面,隨着時間的推移,任何改進都會轉移到所有創建的對象上。

事情是這樣的:

public static class SingletonData 
{ 
    static private List<TypeCode> _TypeCode; 

    public static List<TypeCode> TypeCode 
    { 
     get 
     { 
      if (_TypeCode!=null) return _TypeCode; 
      using (var db = new SQlEntitiesContainer()) 
      { 
       _TypeCode = db.TypeCodes.ToList(); 
       return _TypeCode; 
      } 
     }   
    } 

    static private List<TypeCode1> _TypeCode1; 

    public static List<TypeCode1> TypeCode1 
    { 
     get 
     { 
      if (_TypeCode1 != null) return _TypeCode1; 
      using (var db = new SQlEntitiesContainer()) 
      { 
       _TypeCode1 = db.TypeCode1.ToList(); 
       return _TypeCode1; 
      } 
     } 
    } 

} 
+0

我想嘗試一下。你有什麼樣的例子嗎?只是爲了看看我應該看什麼 – user575219

+0

我編輯了我上面的回覆。您不必將該類設爲靜態,但我認爲列表應該是靜態的,因此無論創建了多少類,內存中只有一個副本。你可以擴展它來檢查並看看自從創建單例以來是否有新項目被添加到數據庫中,但我並不真正將它看作是你的用例的一部分,所以我沒有添加它。希望能幫助到你。 – MarkWalls