ASP.NET CORE 1.0.0でプロジェクトを行っており、EntityFrameworkCoreを使用しています。個別のアセンブリがあり、プロジェクト構造は次のようになります。
ProjectSolution
-src
-1 Domain
-Project.Data
-2 Api
-Project.Api
私のProject.Api
はStartup
クラスです
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ProjectDbContext>();
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ProjectDbContext>()
.AddDefaultTokenProviders();
}
DbContext
は私のProject.Dataプロジェクトにあります
public class ProjectDbContext : IdentityDbContext<IdentityUser>
{
public ProjectDbContext(DbContextOptions<ProjectDbContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var builder = new ConfigurationBuilder();
builder.SetBasePath(Directory.GetCurrentDirectory());
builder.AddJsonFile("appsettings.json");
IConfiguration Configuration = builder.Build();
optionsBuilder.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection"));
base.OnConfiguring(optionsBuilder);
}
}
最初の移行を行おうとすると、次のエラーが表示されます。
「ターゲットプロジェクト「Project.Api」は移行アセンブリ「Project.Data」と一致しません。ターゲットプロジェクトを変更するか、移行アセンブリを変更します。DbContextOptionsBuilderを使用して移行アセンブリを変更します。たとえば、options.UseSqlServer(connection、b = > b.MigrationsAssembly( "Project.Api"))。デフォルトでは、移行アセンブリはDbContextを含むアセンブリですパッケージマネージャーコンソールの[デフォルトプロジェクト]ドロップダウンリストを使用するか、実行することにより、ターゲットプロジェクトを移行プロジェクトに変更します。移行プロジェクトを含むディレクトリの「dotnet ef」。
このエラーが表示された後、Project.Api
にあるこのコマンドを実行しようとしました。
dotnet ef --startup-project ../Project.Api --Assembly "../../1 Data/Project.Data" migrations add initial Initial
私はこのエラーを受け取りました:
「オプション 'Assembly'の予期しない値 '../../1 Domain/Project.Data'」
Dont know why I get this error, when I try to execute the command with the
- Assembly`パラメーター。
他のアセンブリから初期移行を作成できず、それに関する情報を検索しましたが、結果が得られませんでした。
誰かが同様の問題を抱えていますか?
すべてのEFコマンドには このチェック があります。
if (targetAssembly != migrationsAssembly)
throw MigrationsAssemblyMismatchError;
targetAssembly=操作しているターゲットプロジェクト。コマンドラインでは、現在の作業ディレクトリにあるプロジェクトです。パッケージマネージャーコンソールでは、そのウィンドウペインの右上にあるドロップダウンボックスで選択されているプロジェクトが何でもです。
migrationsAssembly=移行用のコードを含むアセンブリ。これは構成可能です。デフォルトでは、これはDbContextを含むアセンブリであり、この場合はProject.Data.dllです。エラーメッセージが示唆するように、これを解決するための2つのオプションがあります
1-ターゲットアセンブリを変更します。
cd Project.Data/
dotnet ef --startup-project ../Project.Api/ migrations add Initial
// code doesn't use .MigrationsAssembly...just rely on the default
options.UseSqlServer(connection)
2-移行アセンブリを変更します。
cd Project.Api/
dotnet ef migrations add Initial
// change the default migrations Assembly
options.UseSqlServer(connection, b => b.MigrationsAssembly("Project.Api"))
パッケージマネージャーコンソールのトップバー=> "既定のプロジェクト"が "Project.API"ではなく "Project.Data"であることに気づくまで、私は同じ問題を抱えていました。
ドロップダウンリストから「Project.Data」をターゲットにして移行を実行したら、問題はありません。
EF Core 2を使用すると、WebプロジェクトとData(DbContext)プロジェクト。実際、IDesignTimeDbContextFactoryインターフェイスを実装するだけです。 Microsoft docs 、IDesignTimeDbContextFactoryによると:
派生DbContextインスタンスを作成するためのファクトリ。このインターフェイスを実装して、パブリックデフォルトコンストラクターを持たないコンテキストタイプの設計時サービスを有効にします。設計時に、派生DbContextインスタンスを作成して、移行などの特定の設計時のエクスペリエンスを有効にすることができます。設計時サービスは、スタートアップアセンブリまたは派生コンテキストと同じアセンブリにあるこのインターフェイスの実装を自動的に検出します。
下部のコードスニペットでは、Dataプロジェクト内で定義されているDbContextFactoryの実装を確認できます。
public class DbContextFactory : IDesignTimeDbContextFactory<KuchidDbContext>
{
public KuchidDbContext CreateDbContext(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var dbContextBuilder = new DbContextOptionsBuilder<KuchidDbContext>();
var connectionString = configuration.GetConnectionString("Kuchid");
dbContextBuilder.UseSqlServer(connectionString);
return new KuchidDbContext(dbContextBuilder.Options);
}
}
これで、(Web)プロジェクトをスタートアッププロジェクトとして設定し、(Dataパッケージマネージャーコンソール内のプロジェクト。
Add-Migration initial
詳細を見つけることができます こちら 。ただし、このブログ投稿では、IDesignTimeDbContextFactoryの代わりに廃止されたクラスを使用しています。
私は同じ問題で走りました this
クラスライブラリで移行を実行しようとしていますか?私もそうでした。これはまだサポートされていないことがわかったので、回避する必要があります。
編集: this git repo で解決策を見つけました
現在、EFはまだクラスライブラリ上にないプロジェクトへの移行の追加のみをサポートしていると思います。
そして、プロジェクト内の特定のフォルダーに移行を追加したい他の人のためにサイドノート:
EF CLIはまだこれをサポートしていません。私は試した --data-dir
しかし、うまくいきませんでした。
唯一機能するのは、パッケージマネージャーコンソールを使用することです。
-OutputDir
コマンドパラメータ、.e.g。、Add-Migration InitConfigurationStore -OutputDir PersistedStores/ConfigurationStore
コマンドは、プロジェクトのフォルダー「PersistedStores/ConfigurationStore」にmgirationを出力します。public void ConfigureServices(IServiceCollection services)
{
...
string dbConnectionString = services.GetConnectionString("YOUR_PROJECT_CONNECTION");
string assemblyName = typeof(ProjectDbContext).Namespace;
services.AddDbContext<ProjectDbContext>(options =>
options.UseSqlServer(dbConnectionString,
optionsBuilder =>
optionsBuilder.MigrationsAssembly(assemblyName)
)
);
...
}
(ASP.NET Core 2+)
同じ問題がありました。ここに私がやったことがあります:
移行を含むプロジェクト(Project.B)からDbContextを含むプロジェクト(Project.A)を参照します。
既存の移行をProject.AからProject.Bに移動します(移行がない場合-最初に作成します)
Project.A内の移行アセンブリを構成します。
options.UseSqlServer(connectionString、x => x.MigrationsAssembly( "Project.A"));
プロジェクトが同じ親フォルダーにあると仮定します。
dotnet ef migrations add Init --project ../AskGoo.Data -c DbContext
移行はProject.Bに移動します
ソース: Microsoft
Add-Migration NewMigration -Project MyApp.Migrations
私は同様の問題に直面していましたが、答えはどういうわけかうまくいかなかったようです。私の答えは、@ Ehsan Mirsaeediに似ていますが、DbContextFactoryクラスが少し変更されています。 APIのStartupクラスに移行アセンブリ名を追加する代わりに、Dataプロジェクト(クラスライブラリ)の一部であるDbContextFactoryクラスで言及しました。
public class DbContextFactory : IDesignTimeDbContextFactory<KuchidDbContext>
{
public KuchidDbContext CreateDbContext(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var dbContextBuilder = new DbContextOptionsBuilder<KuchidDbContext>();
var connectionString = configuration.GetConnectionString("connectionString");
var migrationAssemblyName= configuration.GetConnectionString("migrationAssemblyName");
dbContextBuilder.UseSqlServer(connectionString, o => o.MigrationAssembly(migrationAssemblyName));
return new KuchidDbContext(dbContextBuilder.Options);
}
}
SetBasePathおよびAddJsonFile拡張機能を機能させるには、「Microsoft.Extensions.Configuration」および「Microsoft.Extensions.Configuration.Json」が必要です。
注:これは単なる回避策だと思います。どういうわけか、スタートアップクラスからDbContextOptionsを取得する必要があります。間違いなく配線の問題があると思います。
複数のスタートアッププロジェクトをお持ちの皆様へ.
ターゲットプロジェクトをスタートアッププロジェクトとして設定する必要があることに注意してください-Project.Api
(質問の例から)スタートアッププロジェクトにする必要があります。
それが誰かを助けることを願っています:)