.Net Standard 1.6クラスライブラリでEF Core Migrationを実行しようとしましたが、失敗していました。ただし、.Net Core 1.1クラスライブラリでも同じことがうまくいきます。
EF Migrationは.NET STANDARDでサポートされていますか?
DbContext
がnetstandardx.y
クラスライブラリ内に配置されている場合、ドキュメントはこのケースを know issue /limitationとしてカバーしています。
回避策1-アプリをスタートアッププロジェクトとして使用する
既存の.NET Coreアプリまたは.NET Frameworkアプリ(ASP.NET Core Webアプリケーションを含む)がある場合、それらをスタートアッププロジェクトとして使用できます。そうでない場合は、.NETコマンドラインツールで使用するためだけに新しいものを作成できます。 「実行可能なアプリ」であるスタートアッププロジェクトを指定します。例:コンソール
dotnet ef migrations list --startup-project ../MyConsoleApp/
回避策2-実行可能なフレームワークをクロスターゲット
クラスライブラリプロジェクトに追加のターゲットフレームワークを追加します。これは、.NET Core Appまたは.NET Frameworkのいずれかのバージョンです。プロジェクトを.NET Coreアプリにするには、以下のサンプルのように「netcoreapp1.0」フレームワークをプロジェクトに追加します。XML
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netcoreapp1.0;netstandard1.4</TargetFrameworks> </PropertyGroup> </Project>
.NET Frameworkをターゲットにする場合、プロジェクトターゲットバージョン4.5.1以降を確認してください。 XML
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net46;netstandard1.4</TargetFrameworks> </PropertyGroup> </Project>
次のエラーが表示されるEF Core Package Managerコンソールツールユーザーの場合:
スタートアッププロジェクト「MyNetStandardLibrary」は、フレームワーク「.NETStandard」を対象としています。このフレームワークに関連付けられたランタイムはなく、それを対象とするプロジェクトを直接実行することはできません。このプロジェクトでEntity Framework Core Package Managerコンソールツールを使用するには、このプロジェクトを参照する.NET Frameworkまたは.NET Coreを対象とする実行可能プロジェクトを追加し、スタートアッププロジェクトとして設定します。または、このプロジェクトをクロスターゲット.NET Frameworkまたは.NET Coreに更新します。
OR
ターゲットプロジェクト「MyNetCoreApp」が移行アセンブリ「MyNetStandardLibrary」と一致しません。ターゲットプロジェクトを変更するか、移行アセンブリを変更します。
ドキュメント は、これらのエラーの原因を明らかにします。
ターゲットプロジェクトは、ファイルが追加される(または場合によっては削除される)場所です。ターゲットプロジェクトは、パッケージマネージャーコンソールで選択したデフォルトプロジェクトにデフォルト設定されますが、-Projectパラメーターを使用して指定することもできます。
スタートアッププロジェクトは、プロジェクトのコードを実行するときにツールによってエミュレートされるプロジェクトです。ソリューションエクスプローラーでは、既定で1つのスタートアッププロジェクトとして設定されます。 -StartupProjectパラメーターを使用して指定することもできます。
簡単に言うと、スタートアッププロジェクトを.NETランタイム(この場合は.NET Core)を持つプロジェクトに設定し、パッケージマネージャーコンソール>デフォルトプロジェクトとして.NET標準プロジェクトを設定する必要があります。
CLIソリューションの例:
Add-Migration MyMigration -Project MyNetStandardLibrary -StartupProject MyNetCoreApp
非CLIソリューション:
.Net Standard 1.6で試したことはありませんが、2.0でも機能します。
Microsoft.EntityFrameworkCore.Tools.DotNet
は、DbContext
を含む各クラスライブラリに追加する必要があります。プロジェクトを右クリックして、Edit *.csproj
を選択します。次に、以下を追加します。
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0-preview2-final" />
</ItemGroup>
より詳細なチュートリアルについては、こちらをご覧ください: EF 7 Migrations with multiple DBContexts
@Tseng、ありがとう!ここに明示的な指示があります。
プロジェクトファイルの編集:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
</ItemGroup>
</Project>
次に、デザインファクトリを追加します。
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);Initial Catalog=Activities;Integrated Security=False;User ID=user;Password=pw;Connect Timeout=30;Encrypt=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;")
.Options);
return context;
}
}
次にビルドします。
次に、コマンドプロンプトを開き、プロジェクトフォルダーに移動して、次を実行します。
dotnet ef migrations add InitialCreate
これで、自動生成された移行フォルダがあるはずです。大好きです!
マイクロソフトにとっては恥ずべきことです。
ドットネットコアソリューションのコンソールアプリにdbcontextを転送しました。
私のソリューションには5つのプロジェクトがあります。
その後、dotnet ef migrations add CreateDatabase
を実行します
vs codeとdotnet cliを使用します。