初始化實體框架上下文的最佳方法是什麼?

c# entity-framework

初始化實體框架上下文時。

一種是在類級別初始化,例如

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背景來看,我更喜歡後來的one-initialize in方法,但第一個是來自Stephen Walthe開發的例子。或者另一個問題,它是否重要?

一般承認的答案

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

另一方面,您不希望長時間保持實體上下文,因為它會跟踪內存,因為它會跟踪對越來越多對象的更改。

這似乎是“每個類的一個上下文”選項的參數,但實際上並非如此。這更像是“每單位工作一個背景”的論據。


熱門答案

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

有一篇文章很好地解釋了每個請求範例背景的原因: 實體框架對像上下文範圍



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因