web-dev-qa-db-ja.com

異なるアセンブリで移行を追加する

ASP.NET CORE 1.0.0でプロジェクトを行っており、EntityFrameworkCoreを使用しています。個別のアセンブリがあり、プロジェクト構造は次のようになります。

ProjectSolution
   -src
      -1 Domain
         -Project.Data
      -2 Api
         -Project.Api

私のProject.ApiStartupクラスです

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`パラメーター。

他のアセンブリから初期移行を作成できず、それに関する情報を検索しましたが、結果が得られませんでした。

誰かが同様の問題を抱えていますか?

28
kdar

すべての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"))
43
natemcmaster

パッケージマネージャーコンソールのトップバー=> "既定のプロジェクト"が "Project.API"ではなく "Project.Data"であることに気づくまで、私は同じ問題を抱えていました。

ドロップダウンリストから「Project.Data」をターゲットにして移行を実行したら、問題はありません。

19
Dre Ross

EF Core 2を使用すると、WebプロジェクトとData(DbContext)プロジェクト。実際、IDesignTimeDbContextFactoryインターフェイスを実装するだけです。 Microsoft docsIDesignTimeDbContextFactoryによると:

派生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の代わりに廃止されたクラスを使用しています。

10
Ehsan Mirsaeedi

私は同じ問題で走りました this

クラスライブラリで移行を実行しようとしていますか?私もそうでした。これはまだサポートされていないことがわかったので、回避する必要があります。

編集: this git repo で解決策を見つけました

5
Alan Jagar

現在、EFはまだクラスライブラリ上にないプロジェクトへの移行の追加のみをサポートしていると思います。

そして、プロジェクト内の特定のフォルダーに移行を追加したい他の人のためにサイドノート

EF CLIはまだこれをサポートしていません。私は試した --data-dirしかし、うまくいきませんでした。

唯一機能するのは、パッケージマネージャーコンソールを使用することです。

  1. デフォルトのプロジェクトを選ぶ
  2. つかいます -OutputDirコマンドパラメータ、.e.g。、Add-Migration InitConfigurationStore -OutputDir PersistedStores/ConfigurationStoreコマンドは、プロジェクトのフォルダー「PersistedStores/ConfigurationStore」にmgirationを出力します。

2017年10月12日現在の更新

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)
        )
   );

   ...
}
5
David Liang

(ASP.NET Core 2+)

同じ問題がありました。ここに私がやったことがあります:

  1. 移行を含むプロジェクト(Project.B)からDbContextを含むプロジェクト(Project.A)を参照します。

  2. 既存の移行をProject.AからProject.Bに移動します(移行がない場合-最初に作成します)

  3. Project.A内の移行アセンブリを構成します。

options.UseSqlServer(connectionString、x => x.MigrationsAssembly( "Project.A"));

プロジェクトが同じ親フォルダーにあると仮定します。

  1. dotnet ef migrations add Init --project ../AskGoo.Data -c DbContext

移行はProject.Bに移動します

ソース: Microsoft

3
Kaloyan Drenski
Add-Migration NewMigration -Project MyApp.Migrations
1
Majid joghataey

私は同様の問題に直面していましたが、答えはどういうわけかうまくいかなかったようです。私の答えは、@ 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を取得する必要があります。間違いなく配線の問題があると思います。

0
Mady

複数のスタートアッププロジェクトをお持ちの皆様へ.

ターゲットプロジェクトをスタートアッププロジェクトとして設定する必要があることに注意してください-Project.Api(質問の例から)スタートアッププロジェクトにする必要があります。

それが誰かを助けることを願っています:)

0
Atanas Sarafov