我們有一列可能存在也可能不存在于表中。如果它不存在,我們希望呼叫 Fluent API ignore 命令:
modelBuilder.Entity().Ignore(c => c.FullName);
問題是在 OnModelCreating 的范圍內確定該列是否存在,然后再決定忽略。
我看過這個解決方案:Entity Framework check if column exists during OnModelCreating
它利用 Database.Connectionstring 屬性,但在 Core 上不可用,如果您使用 Database.GetConnection().ConnectionString 那么它會由于在模型創建期間嘗試使用 DbContext 而失敗。
如何從這里訪問我需要的連接字串?有沒有不同的方法來檢查列是否存在?
uj5u.com熱心網友回復:
使用 DbContext 實體來執行此操作并不是一個好方法。
而是從配置訪問連接字串并直接使用 DbConnection 查詢資料庫以確定該列是否存在。您可以在啟動時執行此操作,或者在啟動時注入一個單獨的服務,該服務可以訪問資料庫元資料并驅動 OnModelCreating 中的條件流暢配置。
uj5u.com熱心網友回復:
ConfigurationManager.ConnectionStrings 應該暴露它。
如果該列可能存在或不存在,您需要確保它永遠不會在查詢運算式中使用,例如Where/ 甚至Select/ProjectTo子句。這些僅在列存在并被映射時才有效,因此如果您確實想在Select投影中使用它,您幾乎需要將其視為被忽略或分散在周圍的條件邏輯。
洗掉它并在您的視圖模型中保留一個計算值可能更可靠,并使用所需格式的可配置選項(例如姓氏,名字與名字姓氏,如果這適用于人名)然后處理插入/更新作為具有邊界 DbContext 實體的單獨條件操作,該實體配置為在類上使用它。這甚至可以在 DbContextSaveChanges覆寫上處理,以便更新或插入可以被攔截,從初始 DbContext 中丟棄,如果該客戶端正在使用該列,則由有界 DbContext 完成。(在處理 FullName 是不可為空的列的插入的情況下是必需的)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/381543.html
