簡體   English   中英

從DbContext檢索數據時如何正確使用'using'語句

[英]How to properly use the 'using' statement when retrieving data from DbContext

我昨天在這里發表了一個詳細的問題, 僅在關閉和打開對話框后才更新數據庫

總而言之,當關閉我的子窗體時,應該將帶有DataGridView的窗體重新加載並從數據庫中檢索最新數據。 但是,它正在檢索PRE-Updated數據而不是POST-Updated數據。

我發現,如果在調用GetAllByTaskId函數時更改了使用dbcontext的方式,它將從數據庫中檢索最新數據。 但是,這似乎僅適用於某些功能。

例如,我有一個Delete函數,該函數在同一類中調用Get函數。 如果我的Get類使用using()dbcontext方法,則刪除類將不起作用。 我相信這是因為using()方法處理了dbcontext,因此沒有任何內容轉移到我的Delete函數中。

在我的情況下,我將如何正確使用using()函數? 看來我需要2種方法。 另外,奇怪的是我的dbcontext不會從數據庫返回最新數據。

private AutoPrintDbContext dbContext = new AutoPrintDbContext();

public FieldsData()
{

}

public List<Field> GetAllByTaskId(string Input)
{
    List<Field> data = new List<Field>();
    try
    {
        using(AutoPrintDbContext db = new AutoPrintDbContext())
        {
            data = db.Fields.Where(x => x.TaskItemId == Input).ToList();
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
    return data;
}

public Field Get(string Input)
{
    Field data = new Field();
    try
    {
        data = dbContext.Fields.SingleOrDefault(u => u.Id == Input);
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
    }
    return data;
}

public bool Delete(string Input)
{
    try
    {
        var f = Get(Input);
        dbContext.Fields.Remove(f);
        dbContext.SaveChanges();
        return true;
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        return false;
    }
}

順便說一下,這是一個Windows窗體應用程序。

似乎您需要一些有關如何正確使用實體框架的指南。

我了解每次對DbContext執行操作(或在using范圍內的許多操作)時都創建DbContext實例似乎是違反直覺的,但是從DbContext DbContextDbContext類的設計考慮了這一點( 請參見此處 ) ,否則,它的變更跟蹤系統(默認情況下處於啟用狀態)會隨着您使用其長期存在的實例而受到越來越多的污染,這將導致性能隨着時間的流逝而下降,並且還取決於您用來檢索實體的API(例如DbSet.Find() ),它將為您提供跟蹤的(緩存的)實例,而不是從數據庫中提取它。

您可以在下面找到帶有一些修改的示例,以更好地完成所需的工作:


public List<Field> GetAllByTaskId(string Input)
{
    using (var db = new AutoPrintDbContext())
    {
        return db.Fields.Where(x => x.TaskItemId == Input).ToList();
    }
}

public Field Get(string Input)
{
    using (var db = new AutoPrintDbContext())
    {
        return db.Fields.SingleOrDefault(u => u.Id == Input);
    }
}

public bool Delete(string Input)
{
    try
    {
        using (var db = new AutoPrintDbContext())
        {
            var f = db.Fields.Single(u => u.Id == Input);
            db.Fields.Remove(f);
            db.SaveChanges();
        }

        return true;
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        return false;
    }
}

如果您想更好地了解實體框架,強烈建議您瀏覽以下鏈接: https : //docs.microsoft.com/zh-cn/ef/ef6/fundamentals/performance/perf-whitepaper

暫無
暫無

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

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