簡體   English   中英

管理DbContext EF6

[英]Managing DbContext EF6

我正在構建Webforms EF6數據庫第一個應用程序,並且不確定如何最好地管理DbContext。 我看了很多教程和論壇帖子,但我仍然確定。 關於備受青睞的“按請求使用”,我還沒有找到一種一次性拯救父母和子女的方法。 我可以將其與下面的代碼一起使用,但是我應該在何時何地處理上下文? 我可以使用這種方法嗎? 此處顯示的Kamyar的按請求方式會更好嗎?

這是我現在得到的:

public static class ContextManager
{
    [ThreadStatic]
    private static MyContext current;

    public static MyContext MyCurrentContext
    {
        get{
        if (current == null)
            current = new MyContext();

        return current;
    }}
}

加上

var context = ContextManager.MyCurrentContext;
.....
context.SaveChanges();

在此先感謝您的幫助!

一個特定的示例是“ UserProfile”,其中包含子對象作為屬性,例如“ DefaultInvoiceAddress”,該屬性從具有所有用戶地址的表中返回用戶的默認發票地址。 在我工作的上一個Web應用程序中,當用戶從配置文件中編輯此地址(例如,街道變更)以及其他表中的其他配置文件信息時,EF會在一個請求中保存來自不同表的所有編輯信息(確保他們重新連接)。 由於我對上下文管理不了解,所以我不知道它是如何完成的,但是我們總是會為請求分配一個通用的當前上下文。

我遇到了Rick Strahl撰寫的這篇文章 ,以及Jordan Jordan Go Gogh 撰寫的這篇文章 -業務對象/事務似乎是一個答案,但是我不太了解如何實現它,也找不到示例。 “每個HTTP請求的共享ObjectContext實例”對應於上面提到的Kamyar的回答,並且考慮到所有因素,這聽起來是一個不錯的選擇。 如果需要,我是否必須明確處置上下文? 有什么缺點嗎?

餿主意。 靜態完全違反最佳實踐。 沒有2個用戶會同時使用該應用程序嗎? 哎喲。 對於WebForms。

每個請求是最佳選擇。

EF db上下文對象不是 ,無論您如何管理,我都重復執行NOT線程安全。 跨線程共享db上下文會引起很多問題,因此最好的方法是如上所述,根據請求使用它。

如果您不想跳到IoC / DI方面,那么一種非常簡單的方法就是只要需要數據庫,就可以在using塊中實例化上下文,如下所示:

using(var db = new MyContext())
{
    // code reading from/writing to database
    ...
    ...
}

在實體框架數據庫上下文中使用單例模式是一個設計缺陷,特別是在處理諸如Web表單之類的並發環境時,因為必須考慮DbContext不是線程安全的對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM