在Entity Framework Core中創建遷移時如何配置DbContext?

.net-core c# dbcontext dependency-injection entity-framework-core

在使用Entity Framework的遷移命令時,是否可以配置/引導依賴注入?

Entity Framework Core支持DbContext子類的依賴注入。該機制包括允許在DbContext之外配置數據訪問。

例如,以下內容將使用從config.json檢索的連接字符串將EF配置為持久保存到SQL Server

ServiceCollection services = ...

var configuration = new Configuration().AddJsonFile( "config.json" );
services.AddEntityFramework( configuration )
    .AddSqlServer()
    .AddDbContext<BillingDbContext>( config => config.UseSqlServer() );

但是,遷移命令不知道執行此代碼,因此由於缺少提供程序或缺少連接字符串, Add-Migration將失敗。

通過在DbContext子類中重寫OnConfiguring來指定提供者和配置字符串,可以使遷移工作,但是當其他地方需要不同的配置時,這會妨礙。最終保持我的遷移命令和我的代碼都工作變得非常複雜。

注意:我的DbContext與使用它的入口點不同,而且我的解決方案有多個啟動項目。

一般承認的答案

正如@bricelam所評論的那樣,實體框架7中還沒有這個功能.GitHub問題跟踪了這個缺失的功能aspnet / EntityFramework#639

與此同時,我發現更簡單的解決方法是利用全局狀態而不是使用子類化。通常不是我的第一個設計選擇,但它現在運作良好。

在MyDbContext中:

public static bool isMigration = true;

protected override void OnConfiguring( DbContextOptionsBuilder optionsBuilder )
{
    // TODO: This is messy, but needed for migrations.
    // See https://github.com/aspnet/EntityFramework/issues/639
    if ( isMigration )
    {
        optionsBuilder.UseSqlServer( "<Your Connection String Here>" );
    }
}

Startup.ConfigureServices()

public static bool isMigration = true;

protected override void OnConfiguring( DbContextOptionsBuilder optionsBuilder )
{
    // TODO: This is messy, but needed for migrations.
    // See https://github.com/aspnet/EntityFramework/issues/639
    if ( isMigration )
    {
        optionsBuilder.UseSqlServer( "<Your Connection String Here>" );
    }
}

(在我的情況下,配置代碼實際上存在於Autofac模塊中。)


熱門答案

使用IDbContextFactory<TContext>

實現此接口以為沒有公共默認構造函數的上下文類型啟用設計時服務。設計時服務將自動發現此接口的實現,這些實現與派生上下文在同一程序集中。

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;

namespace MyProject
{
    public class BloggingContextFactory : IDbContextFactory<BloggingContext>
    {
        public BloggingContext Create()
        {
            var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
            optionsBuilder.UseSqlServer("connection_string");

            return new BloggingContext(optionsBuilder.Options);
        }
    }
}

更多信息: https//docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext

如果你不愉快的硬編碼的連接字符串,來看看這個文章。




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