我正在通過演示 .net 6 應用程式實作一個模式。在這個應用程式中,我有一個DemoContext,它實作了DBContext并將所有表作為 DbSet<Table_Names>。我還創建了另外兩個名為DataReaderContext和DataWriterContext的類,顧名思義,我計劃將它們分別用于從資料庫讀取和寫入資料庫。這兩個類都擴展了 DemoDBContext 類。現在,由于我遵循代碼優先方法,我將添加遷移以同步我的模型類和資料庫表。
現在告訴你我在這兩個類背后的意圖,我考慮過將 QueryTrackingBehavior 設定為對讀者不進行跟蹤,因為它的作業是只從資料庫中進行讀取操作。對于 Writer 背景關系,除了擴展主背景關系類之外,我沒有做任何特別的事情。
現在,當我嘗試添加初始遷移時,問題就來了。它說我有多個背景關系。我找到了需要使用 -context 選項傳遞背景關系名稱(以及整個命名空間)的解決方案,但在這種情況下,我應該傳遞主背景關系嗎?還是讀者背景?還是作者背景關系?因為在主背景關系中傳遞意味著跟蹤行為沒有變化。如果假設我為讀取器和寫入器背景關系創建遷移,因為它們的基類是 DemoContext 并且可能會創建兩次表,它也不會產生問題嗎?
這種方法有問題還是有其他方法可以實作?我在這里做錯了嗎?我在下面附上代碼片段
public class DemoContext : DbContext
{
public DemoContext()
{
}
public DemoContext(DbContextOptions options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//connecton string configuration
}
//DBSets
}
public class DataReaderContext : DemoContext
{
public DataReaderContext(DbContextOptions<DataReaderContext> options) : base(options)
{
this.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
}
}
public class DataWriterContext : DbContext
{
public DataWriterContext(DbContextOptions<DataWriterContext> options) : base(options)
{
}
}
uj5u.com熱心網友回復:
恕我直言,對所有讀取和寫入操作使用單獨的 DbContext 有點矯枉過正。也就是說,對于某些操作,出于組織或性能原因分離 DbContexts 可能是有益的。例如,如果您正在記錄或審核資料庫,您可能會受益于讓該背景關系管理具有其他相關物體的非常輕量級表示的相應操作的物體,而不是將所有內容都放在一個大型 DbContext 中,因為這些操作應該獨立于更新提交可以在主應用程式 DbContext 上進行跟蹤。即在保存期間撰寫日志記錄例外不應被“污染”并被無法成功保存的更改阻塞。這通常稱為“有界”DbContexts。在較大的系統中,將功能區域組織到負責該區域的寫入操作的單獨 DbContext 中可能是有益的。(同時出于閱讀/關聯目的而對其他常見物體有所了解。)
我將在較大的系統中使用只讀 DbContexts 進行報告型別查詢。這些通常指向不需要實時資料準確性的只讀副本資料庫,但我不想冒主資料庫上潛在讀取鎖的風險。我將使用一個縮減的單獨 DbContext 來執行諸如阻止SaveChanges呼叫之類的操作,而不是使用一個具有指向副本的實體的單個 DbContext。運行昂貴的應用內查詢的用戶將被定向到此報告 DbContext。如果他們選擇一行來實際執行操作,則將 ID 移交給主 DbContext 針對實時生產資料庫加載。這方面的例子可以是構建報告,或者經理運行他們可能想要深入研究和審查的廣泛查詢。
在任何情況下,如果單個資料庫模式需要單獨的 DbContext,并且您希望該模式由 Code-First 管理,則應指定一個作為模式的所有者,并且所有附屬 DbContext 將設定為 DB-First。
如果您想充分利用讀取性能,我強烈建議您利用投影而不是加載整個物體圖(關系)并嘗試在跟蹤和未跟蹤查詢之間進行權衡。有效使用投影可以提高查詢性能并避免在 EF 中跟蹤膨脹。還要避免像 Generic Repository 模式這樣的反模式,這些模式可能導致性能較差和記憶體使用率較高的查詢,試圖將應用程式直接套入“一刀切”的資料訪問方法。
uj5u.com熱心網友回復:
更改跟蹤行為與遷移無關。只需選擇一個 DbContext 來生成遷移,可能是 DemoContext。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/517093.html
標籤:C#实体框架实体框架核心数据库上下文ef-core-6.0
上一篇:單一背景關系型別,多個提供者
