11

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

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

共有プロジェクトのフォルダーで実行すると、startup.cs で指定された接続文字列にアクセスできません。このような質問から、のOnConfiguringメソッドで接続文字列を指定すると共有プロジェクトから機能することがわかりましたDbContextが、このコードを構成とは別にしたいと思います。

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

4

1 に答える 1

10

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

共有プロジェクトのフォルダーで実行すると、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

上記の仮定が正しければDbContext、クラスで使用したのと同じパターンを使用して、 の接続文字列にアクセスできますStartup。つまり、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 接続文字列を複製したくない場合は、代わりに環境変数またはユーザー シークレットを使用できます。

于 2015-06-17T02:12:45.917 に答える