簡體   English   中英

EF Core 理解遷移

[英]EF Core understanding migrations

我在 EF Core 3.1 中遇到了一些奇怪的行為,這讓我想知道實際發生了什么。 所以希望有人可以詳細地向我解釋這一點。

設想

假設您有兩個項目。 項目 A(主要)和項目 B(副項目)。 對於這兩個項目,您都可以添加/刪除遷移,因為項目 A 已設置為在啟動時從項目 B 獲取所有待處理的遷移並執行它們。

在項目 A 上執行dotnet ef migrations add Test -c AppDbContext -o DbContexts/Migrations/AppDb並在完成后(甚至在將其應用到數據庫之前)執行dotnet ef migrations remove -c AppDbContext ,一切正常,遷移被刪除.

另一方面,對於成功執行add命令后的項目 B,在我嘗試執行remove命令的那一刻(甚至在將其應用於 DB 之前),我收到以下錯誤:

Microsoft.Data.SqlClient.SqlException (0x80131904):與 SQL 服務器建立連接時發生與網絡相關或特定於實例的錯誤。 服務器未找到或無法訪問。 驗證實例名稱是否正確,並且 SQL 服務器配置為允許遠程連接。 (提供者:命名管道提供者,錯誤:40 - 無法打開與 SQL 服務器的連接)

因此,我將錯誤消息作為建議,並開始按照本指南允許遠程訪問數據庫。 引導之后,項目B上的remove命令也成功執行了。

但現在我想知道......為什么在我按照指南操作之前 EF Core 沒有連接到(本地)數據庫,並且它在項目 A 上工作,而不是在 B 上工作......?

編輯

經過更多研究,我從指南中發現了幫助我解決錯誤的具體操作。 在 Sql 服務器配置管理器中將 TCP 端口設置為 1433。 顯然這個字段是空的......但它給我留下了 1 個問題。

為什么add命令 DID 在沒有指定端口的情況下工作,而只是remove命令抱怨連接?

編輯2

還有一個新發現,將以下方法添加到AppDbContext class 時:

protected override void OnConfiguring(DbContextOptionsBuilder options)
{
    options.UseSqlServer("foo");
    base.OnConfiguring(options);
}

add命令工作正常,但remove命令抱怨連接字符串的格式不正確

System.ArgumentException:初始化字符串的格式不符合從索引 0 開始的規范。

所以我們可以由此得出結論, add命令不需要有效的連接字符串(因為它對數據庫沒有任何作用),而remove命令需要有效的連接字符串......但是為什么? 它對數據庫沒有任何作用,對吧?

作為對我自己的問題的回答,這里解釋了addremove遷移的工作原理。

add遷移功能確實需要一個有效的字符串作為上下文中的連接字符串,但它不需要是正確的連接字符串,因為 EF Core 並未真正連接到數據庫。

對於remove遷移功能,您需要正確的連接字符串,因為 EF Core 會連接到數據庫以將本地遷移列表與_EFMigrationsHistory表進行比較,以檢查是否有任何遷移尚未應用於數據庫。 因為remove功能只能刪除 PENDING 遷移。 因此,沒有任何已應用於數據庫的遷移。

暫無
暫無

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

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