2009-06-30 114 views
35

初始化實體框架上下文時。初始化實體框架上下文的最佳方法?

一個是在類層次進行初始化,如

public class EntityContactManagerRepository 
    : ContactManager.Models.IContactManagerRepository 
{ 
    private ContactManagerDBEntities _entities = new ContactManagerDBEntities(); 

    // Contact methods 
    public Contact GetContact(int id) 
    { 
     return (from c in _entities.ContactSet.Include("Group") 
       where c.Id == id 
       select c).FirstOrDefault(); 
    } 
} 

另一種方式是在方法級別初始化。

public class EntityContactManagerRepository 
    : ContactManager.Models.IContactManagerRepository 
{  
    // Contact methods 
    public Contact GetContact(int id) 
    { 
     using (var entities = new ContactManagerDBEntities()) 
      return (from c in entities.ContactSet.Include("Group") 
       where c.Id == id 
       select c).FirstOrDefault(); 
    } 
} 

從Ado.Net背景,我更喜歡後一初始化中的方法,但第一個是從由Stephen Walthe開發的例子。或者另一個問題,它有什麼關係嗎?

+0

鏈接已死... – Jude 2015-02-19 14:46:56

回答

29

這很重要,因爲上下文控制着變化跟蹤數據的生命週期,並且還會影響編輯對象時可以鏈接在一起的對象實例,因爲兩個不同上下文中的對象之間不能有關係。它看起來像我分享的例子來自ASP.NET MVC應用程序。在這種情況下,我通常每個請求使用一個實體上下文,因爲請求是短暫的,並且因爲它很常見,所以在請求中更新對象時,必須獲取其他對象並在它們之間創建關係。

另一方面,您不希望長時間保持實體環境,因爲它會跟蹤對越來越多對象的更改而消化內存。

這可能看起來像是「每類一個上下文」選項的一個參數,但它並不是真的。這更像是「每單位工作一個環境」的論點。

+1

欣賞您的回覆。 「我通常每個請求使用一個實體上下文,因爲請求是短暫的。」 像你這樣的聲音也更喜歡它進入方法級別,因爲這是綁定到請求。 – 2009-06-30 14:46:24

+1

我不會在方法級別執行此操作,因爲「每個請求的方法」是一個控制器操作,而我的控制器不瞭解對象上下文。對我而言,上下文在創建控制器所需的存儲庫/存儲庫的服務中實例化。但是你已經有了一般想法。 – 2009-06-30 15:03:46

7

一般來說:它是ASP.NET中的每個請求的上下文和WinForms/WPF中每個窗口的上下文。

有解釋得很好,每個請求範式的背景下背後的原因的文章: Entity Framework Object Context Scope

2

好了,「最好」的方式總是主觀的。但是,將UnitOfWorkScope類添加到項目中可以大大簡化事情 - 即不必過多考慮創建對象上下文或將工作單元保留回數據庫。

有一篇很好的文章解釋了How To Create a Unit of Work Scope