具有配置的類庫中的實體框架7遷移支架

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

嘗試將遷移添加到位於ASP.NET 5類庫中的EF7模型。運行dnx . ef migration add mymigration失敗,結果不同,具體取決於我運行它的項目。

如果我在主項目的文件夾中運行它,它找不到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可能如下所示:

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!");
        });
    }
}

如果你不是這樣做的話,可能值得嘗試。

我從這樣的問題中收集到,如果你在DbContext的OnConfiguring方法中指定連接字符串,它確實可以在共享項目中工作,但我真的想將這些代碼與配置分開。

的DbContext

如果我的上述假設是正確的,那麼您可以使用在Startup類中使用的相同模式訪問DbContext的連接字符串。也就是說,在DbContext構造函數中,設置IConfiguration 。然後,在OnConfiguring ,訪問連接字符串。它可能看起來像這樣:

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文件。因此,您的項目結構可能如下所示:

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文件都包含DbContext的連接字符串設置。

一些想法

如果你不喜歡複製config.json連接字符串的東西,那麼你可以使用環境變量或用戶機密。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因