[英]Can't enable migrations for Entity Framework on VS 2017 .NET Core
[英]Can't add Entity Framework Core migrations to .NET Standard 2.0 project
我有很多項目的解決方案。 其中之一( Domain
)是一個 .NET 標准 2.0 項目,我在其中創建了我想要啟用數據庫遷移的 EF Core DbContext
實現。
我看到了各種博客和問答論壇,其中解釋了問題,但由於 .NET Core 較新版本或(可能)針對我的特定解決方案配置,建議的解決方案似乎都不適合我。
解決方案項目
WindowsService
是啟動項目,其中創建並封裝了Engine
的實例以作為 Windows 服務或控制台應用程序運行(用於調試)。
Engine
是真正的核心應用,其中Kestrel
自托管 Web 服務器實例配置為 Web API 並實例化。 其他組件也被實例化並保持活動狀態(UDP 偵聽器、機器看門狗等)。
WebAPI
有Startup
class 但沒有Program
class,因為所有配置和 Web 服務器啟動都在Engine.Program.cs
內完成。
依賴項
第一次嘗試是簡單地從 PMC 啟動add-migration Initial
,以Domain
項目為目標,但它變成:
無法創建類型為“MyDbContext”的 object。 將“IDesignTimeDbContextFactory”的實現添加到項目中,或參閱https://go.microsoft.com/fwlink/?linkid=851728了解設計時支持的其他模式。
然后我按照這個問題提出的解決方案,但是:
add-migration Initial
from PMC,將 My WebAPI
(無Program
類)設置為啟動項目后,變為:
找不到任何兼容的框架版本找不到指定的框架“Microsoft.NETCore.App”,版本“2.1.0”。
- 檢查應用程序依賴項並定位安裝在以下位置的框架版本:C:\Program Files\dotnet\
- 安裝 .NET 核心先決條件可能有助於解決此問題: http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
- .NET 核心框架和 SDK 可以從以下位置安裝: https://aka.ms/dotnet-download
- 安裝了以下版本:2.0.5 在 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 2.0.6 在 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 2.0。 7 在 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 2.0.9 在 [C:\Program Files\dotnet\shared\Microsoft.NETCore.App] 2.1.2 在 [C:\Program Files \dotnet\shared\Microsoft.NETCore.App]
在向域庫項目文件添加額外的目標框架( netcoreapp2.1
)后,來自 PMC add-migration Initial
導致我出現與第一次嘗試相同的錯誤。
在添加對Microsoft.EntityFrameworkCore.SqlServer.Design v1.1.6
的引用后,來自 PMC add-migration Initial
總是導致與第一次嘗試相同的錯誤。
我應該怎么辦?
更新
這是刪除不必要的庫引用后的新Domain.csproj
文件。
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.1.1" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
</ItemGroup>
所有項目中的所有庫都是最新的。
從這里下載並安裝適當的Runtime
和SDK
- 我想你現在需要.NET Core 2.1.302
Microsoft.EntityFrameworkCore.SqlServer.Design
不再需要,因為它包含在 SDK 中。 也不需要EntityFrameworkCore
的csproj
文件中的CLI
參考。
確保您Manage NuGet packages
window 顯示所有更新。
在您的任何地方添加 web 項目實現IDesignTimeDbContextFactory
接口 - 它將自動找到並用於Package Manager Console
中的 EF Add-Migration
(或dotnet ef
... 類似物)命令
public class DesignTimeActivitiesDbContextFactory: IDesignTimeDbContextFactory<ActivitiesDbContext> { public ActivitiesDbContext CreateDbContext(string[] args) { DbContextOptionsBuilder<ActivitiesDbContext> builder = new DbContextOptionsBuilder<ActivitiesDbContext>(); var context = new ActivitiesDbContext( builder.UseSqlServer("Data Source=(local)\LocalDB;Initial Catalog=DB_name;Integrated Security=True;").Options); return context; } }
要從appsettings
配置文件中讀取連接字符串,您可以執行以下操作:
public class DesignTimeActivitiesDbContextFactory : IDesignTimeDbContextFactory<ActivitiesDbContext>
{
public ActivitiesDbContext CreateDbContext(string[] args)
{
var builder = new ConfigurationBuilder()
.SetBasePath(Path.Combine(Directory.GetCurrentDirectory()))
.AddJsonFile("appsettings.Development.json", optional: false);
var config = builder.Build();
var optionsBuilder = new DbContextOptionsBuilder<ActivitiesDbContext>()
.UseSqlServer(config.GetConnectionString("DefaultConnection"));
return new ActivitiesDbContext(optionsBuilder.Options);
}
}
注意:在上述代碼工廠中,將使用appsettings.Development.json
文件中定義的連接字符串值。 連接名稱是DefaultConnection
。 換句話說,此設計時工廠用於Code First
命令,如Add-Migration
、 Update-Database
等...)並將它們應用於為Development
環境配置的數據庫連接。
csproj
庫的 csproj 文件應至少包含此 package。 確保您的版本與您的所有 Microsoft 軟件包匹配。 2.1.0
或2.1.1
(此時最新)
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.1" />
</ItemGroup>
</Project>
在Package Manager Console
中,將默認項目設置為您想要遷移的 class 庫。 它是控制台 window 右上角的下拉菜單。 另外,請確保您的啟動項目是具有數據庫連接信息的項目。
如果啟動項目沒有您想要搭建的DbContext
實例,您將收到錯誤消息,因為它不知道如何實現DbContext
。 您應該在Startup.cs
中注冊DbContext
,如下所示:
services.AddDbContext<MyDbContext>(options => options.UseSqlServer(connectionString));
然后,運行命令Add-Migration InitialCreate
。 這將為您的遷移搭建腳手架,它應該向您的 class 庫添加一個文件夾。
之后,運行Update-Database
,它應該應用遷移。
如果您仍然有問題。 確保您運行的是最新的 SDK。 https://www.microsoft.com/net/download
更多信息可以在文檔中找到。 https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.