2012-02-06 47 views
2

是否有任何「最佳實踐」如何處理DataContext的實體框架4?處理在DataContext中的EntityFramework 4.0

目前,我每天窗口做這樣的事情在

public class MyWindow() 
{ 
    MyEntities() _entities; 
    MyWindow() 
    { 
     _entities = new MyEntities(); 
     InitializeComponent(); 
    } 
} 

,然後加載到這樣一個DataGrid:

myGrid.ItemsSource= _entities.MyTable; 

這不是真正的聰明,因爲ErrorHandling是不可能的。

我寧願去一個連接-Class和做這樣的事情:

public class MyData() 
{ 
    public IQueryable<Product> GetAllProducts() 
    { 
     using(MyContext context = new MyContext()) 
     { 
      return context.Products; 
     } 
    } 
} 

但首先,這將創建一個新的上下文實例時間 - 是不是這個壞?

或者我應該寧可在處理我的連接級一個全局靜態的DataContext?沒有得到這個靜態變量非常重載?

public class MyData() 
{ 
    private static MyContext Context = new MyContext(); 
    public IQueryable<Product> GetAllProducts() 
    { 
     return Context.Products; 
    } 
} 
+1

請仔細閱讀神話#10 - http://www.albahari.com/nutshell/10linqmyths.aspx,希望這有助於。 – Flowerking 2012-02-06 14:43:44

+1

將您的方法分組爲「工作單元」,這樣每次創建新的上下文都是合乎邏輯的 - 只要工作單元正在進行,上下文就應該存在。 – 2012-02-06 14:45:32

+0

好的,所以在每個窗口中都有一個DataContext沒有問題,它只是將自己傳遞給我的Connection-Class(僅用於異常處理情況)? – SeToY 2012-02-06 14:48:15

回答

2

在實體框架,一個ObjectContext/DbContext是一個工作單元,它們的壽命是指短。

有一個靜態的背景下是一個明確的禁忌,因爲這會使用大量的內存更改跟蹤實體(每一個變化跟蹤實體將被緩存和存儲,直到上下文設置)。

包裝紙的使用,喜歡你的「連接級車的例子是去這樣做的正確方法的上下文。這通常被稱爲服務。

一個例子服務:

public class ProductService 
{ 
    public IEnumerable<Product> GetAllProducts() 
    { 
     using(MyContext context = new MyContext()) 
     { 
      foreach(var product in context.Products) 
       yield return product; 
     } 
    } 
} 

務必在上下文會被安置在塊返回結果集合時,將調用要麼ToArray()ToList()或使用yield return(如我的例子)。如果不這樣做,則意味着在使用結果時,延遲執行將嘗試使用處置後的上下文,這將在運行時導致異常。

相關問題