Entity Framework 7の移行によるクラスライブラリの構成

asp.net-core code-first-migrations dnx entity-framework-core visual-studio-2015

質問

ASP.NET 5クラスライブラリに存在するEF7モデルへの移行を追加しようとしています。 dnx . ef migration add mymigration実行しているdnx . ef migration add mymigrationは、実行するプロジェクトに応じて異なる結果で失敗します。

メインプロジェクトのフォルダでDbContextを実行するとDbContext見つけることができませんが、これはDbContextが共有プロジェクトにあり、efコマンドが依存関係を気にしないためです。

共有プロジェクトのフォルダで実行すると、startup.csで指定された接続文字列にアクセスできません。私のような質問から収集しているこのあなたが接続文字列を指定した場合、それは共有プロジェクトから作業を行うことOnConfiguring方法DbContextが、私は本当に設定とは別に、このコードを維持したいと思います。

私はEF7リポジトリのいくつかの問題ログに出くわしました。プロジェクトやコンテキストを指定するためのコマンドラインオプションを実装していると言われていますが、例はなく、コミット履歴のソースコードを調べる方法を理解できませんでした。

受け入れられた回答

あなたのために働くかもしれないアプローチがここにあります。

共有プロジェクトのフォルダで実行すると、startup.csで指定された接続文字列にアクセスできません。

Startup.cs

あなたのStartup.csでは、ハードコードするのではなくConfigurationアクセスして接続文字列を指定していると仮定しています。さらに、私は、あなたのStartup.csファイルのコンストラクタで、いくつかのソースから構成を設定していると仮定しています。つまり、Startup.csは次のようになります。

public class Startup
{
    public IConfiguration Config { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddUserSecrets()
            .AddEnvironmentVariables();

        Config = config;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<MyDbContext>(options =>
            {
                options.UseSqlServer(Config["ConnectionStrings:MyDbContext"]);
            });
    }

    public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
    {
        var db = serviceProvider.GetRequiredService<MyDbContext>();
        db.Database.AsSqlServer().EnsureCreated();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

config.json

さらに、私はあなたのプロジェクトのルートにあるconfig.jsonに接続文字列を追加していると仮定しています(あるいは、ユーザーの秘密や環境変数を使って接続文字列を追加しています)。config.jsonは次のようになります:

{
  "ConnectionStrings": {
    "MyDbContext": "Some-Connection-String"
  }
}

あなたがそのようにしていないなら、それを試す価値があるかもしれません。

私は、DbContextのOnConfiguringメソッドで接続文字列を指定すると、共有プロジェクトから作業するというこのような質問を集めましたが、このコードを構成とは別にしておきたいと思います。

DbContext

上記の私の前提が正しい場合は、 Startupクラスで使用したのと同じパターンを使用して、 DbContext接続文字列にアクセスできます。つまり、 DbContextコンストラクタでDbContextを設定しIConfiguration 。次に、 OnConfiguringで、接続文字列にアクセスします。それは次のようになります。

public class MyDbContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder builder)
    {
        builder.Entity<SomeModel>().Key(e => e.Id);
        base.OnModelCreating(builder);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var connString = Config["ConnectionStrings:MyDbContext"];
        optionsBuilder.UseSqlServer(connString);
    }

    public IConfiguration Config { get; set; }

    public MyDbContext()
    {
        var config = new Configuration()
            .AddJsonFile("config.json")
            .AddEnvironmentVariables();

        Config = config;
    }
}

プロジェクトの構造

もちろん、共有プロジェクトフォルダのルートにもconfig.jsonファイルが必要です。したがって、プロジェクトの構造は次のようになります。

SharedDataContext
    Migrations
    config.json
    project.json

WebApp
    config.json
    project.json
    Startup.cs

上記の両方のconfig.jsonファイルには、 DbContext接続文字列設定が含まれています。

いくつかの考え

config.json接続文字列を複製したくない場合は、代わりに環境変数またはユーザーシークレットを使用できます。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ