如何将 dotnet-ef 工具与 DI 实例化的 DbContext 一起使用?

问题描述

我正在使用 DDD 方法并在我的项目中添加一个持久层。该层向 IServiceCollection 发布了一个扩展方法,用于初始化 efcore。我只发布存储库而不是 DbContext 本身。

IServiceCollection 扩展

public static IServiceCollection AddPersistenceLayer(this IServiceCollection services,string connectionString)
{
    // internal dependencies
    services.AddDbContextFactory<AppDbContext>(
        o => o.UsesqlServer(connectionString,p => p.EnableRetryOnFailure()));
    services.AddDbContext<AppDbContext>(
        o => o.UsesqlServer(connectionString,p => p.EnableRetryOnFailure()));

    // public dependencies (consument of DbContext)
    services.AddTransient<IBookRepository,BookRepository>();

    return services;
}

数据库上下文

internal sealed class AppDbContext: DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options)
        :base(options)
    {
    }

    public DbSet<Book> Books { get; set; }
}

到目前为止,使用我的应用程序时效果很好。但是当我想使用 dotnet-ef 工具时,efcore 不会被初始化,因为没有调用上述扩展方法的启动项目。

有没有办法以某种方式解决这个问题?我希望我能从 CLI 传递连接字符串。

如果重要的话,迁移也位于持久层项目中。

我尝试的是创建一个调用扩展方法的启动项目,然后使用以下命令。但没有成功。

dotnet ef database update `
    --project .\src\Persistence\Persistence.csproj `
    --startup-project .\src\Persistence.Tools\Persistence.Tools.csproj `
    0

我不断收到错误消息

无法创建“AppDbContext”类型的对象。

解决方法

也许这个例子可以帮助你完成你想做的事情:

https://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/