我正在嘗試使用 EntityFramework Core/6 與資料庫進行互動。我想保持 DbContext 類盡可能苗條。我這樣做的一種方法是將任何存盤庫構建配置移動到這樣的特定類
public class ProductViewConfiguration : IEntityTypeConfiguration<ProductView>
{
public void Configure(EntityTypeBuilder<ProductView> builder)
{
builder.ToTable("viewProducts");
}
}
如您所見,我正在嘗試配置DbSet<ProductView>視圖。所以我不需要跟蹤此存盤庫中的任何更改。所以我不知何故需要DbSet<>用AsNoTracking().
如何使用EntityTypeBuilder<>構建器將 DbSet 配置為只讀?
uj5u.com熱心網友回復:
當使用您希望視為只讀的視圖時,您可以將物體屬性設定器標記為protected阻止任何未來的代碼期望可以設定這些物體,然后在 DbContext 本身中:
protected DbSet<ProductView> ProductViewsProtected { get; set; }
public IQueryable<ProductView> ProductViews => ProductViewsProtected.AsNoTracking();
使用的一個警告AsNoTracking是,不會跟蹤從基于 ProductViews 的查詢回傳的所有物體,因此如果 ProductView 物體具有您想要更新(出于任何原因)的導航屬性,那么這些將不會被跟蹤。
提供運行時保護而不限制相關物體或 ProductView 物體可能滑入變更跟蹤器的任何其他方式的另一種折衷方案是在物體中實作protected設定器,然后覆寫OnSaveChanges在 DbContext 中檢查 ProductView 和/或任何其他只讀視圖的插入、更新和洗掉物體。如果找到,則拋出例外。這些物體可以由屬性標記,例如 [ReadOnlyEntity],您可以在提交更改之前對其進行檢查。您在物體內的屬性設定器中有一個編譯時守衛,它應該阻止濫用或至少提示新開發人員的問題。主要守衛雖然在運行時,但如果它曾經觸發該例外,那么如果有人無視既定規則,這將成為團隊內部認真討論的理由。[ReadOnlyEntity](如果他們搞亂更改,沒有什么能阻止他們洗掉屬性protectedsetter 和 DbContext 可能仍然無法通過視圖進行更新。)最終目標是讓開發人員更容易理解使用的模式及其原因,而不是試圖讓他們很難犯錯誤。
總的來說,當涉及到物體時,我嘗試使用 DDD 方法來限制對 setter 的訪問。物體構造由建構式作用域的工廠方法處理internal,而大多數“復雜”更新是通過方法而不是單個屬性設定器傳遞給物體的。這可確保更新提供所有必要的詳細資訊,以確保物體始終處于有效狀態。可選的、獨立的屬性 /w 除了長度/范圍/空檢查之外沒有復雜的驗證具有公共設定器。只讀物體根本沒有可見的設定器。如果開發人員在使用的模式方面得到指導,那么在處理沒有設定器的物體時的第一個假設應該是“這是一個只讀物體”,并且至少會引發關于他們的需求的討論。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/461441.html
