[英]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
DbContext
, DbContext
類的設計考慮了這一點( 請參見此處 ) ,否則,它的變更跟蹤系統(默認情況下處於啟用狀態)會隨着您使用其長期存在的實例而受到越來越多的污染,這將導致性能隨着時間的流逝而下降,並且還取決於您用來檢索實體的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.