EF Core - 如何在没有连接字符串的情况下创建迁移。

10

我一直在寻找适合解决这个问题的多个问题、教程和示例。

如果我在想要创建第一个初始迁移时不知道我的连接字符串怎么办?假设我有机会在实例化上下文时设置连接字符串:

var connection = @"Server=(localdb)\mssqllocaldb;Database=JobsLedgerDB;Trusted_Connection=True;ConnectRetryCount=0";
var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>();
optionsBuilder.UseSqlServer(connection);

using (var context = new BloggingContext(optionsBuilder.Options))
{
  // do stuff
}

文档所述...
如果您需要连接字符串来运行迁移,则在没有连接字符串的情况下运行初始迁移的情况下(例如租户数据库,您需要从用户帐户获取连接字符串),该怎么办?
您是否创建虚假连接字符串来创建迁移?这似乎有些不可靠。我希望能得到一些建议。

我不确定我是否正确理解了你的问题。但是你确实需要测试你的应用程序,因此在某个时候你需要有一个工作数据库,对吧?对于开发,我通常会使用我的本地数据库(SQL Server 2017),连接字符串将指向本地服务器。 - VT Chiew
我正在开发这个解决方案。结构是 - 租户详细信息存储在目录数据库中。每个租户都有一个数据库连接作为设置的一部分。问题是我想创建一个初始迁移,但似乎需要在选项中设置连接字符串.. 这是本末倒置.. 我没有连接字符串,因为我是在用户(连接到租户)登录过程中获取它的.. 那么我该如何创建这个初始迁移呢? - si2030
1
我建议您编辑之前的问题,而不是基本上再次提出相同的问题。 - Peter Bons
1
你有找到关于这个的信息吗?我也在使用虚拟连接字符串添加迁移,但是当涉及到 Remove-Migration 时,我猜它不接受虚拟字符串,会失败。 - ibubi
1
你是怎么解决的?我也遇到了同样的问题。 - Carlo Luther
1个回答

1

您可以实现IDesignTimeDbContextFactory接口,以在设计时代替主机构建器。现在,UseSqlServer方法有一个无参重载。

它应该像这样,并且必须与数据库上下文位于同一程序集中或启动项目中:

public class MyAppDbContextFactory: IDesignTimeDbContextFactory<MyAppDbContext>
{
    public MyAppDbContext CreateDbContext(string[] args)
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyAppDbContext>();
        optionsBuilder.UseSqlServer();
            
        return new MyAppDbContext(optionsBuilder.Options);
    }
}

更多详细信息可以在这里找到: https://learn.microsoft.com/zh-cn/ef/core/cli/dbcontext-creation?tabs=dotnet-core-cli#from-a-design-time-factory


在我的情况下,EF只会在SQL脚本中生成一个语句 - 创建“__EFMigrationsHistory”表。 - Mykhailo K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接