繁体   English   中英

如何使用 .NET Core EF 即时创建数据库

[英]How can I create a database on the fly with .NET Core EF

我遇到了dotnet ef的问题。 我正在尝试为遇到的每个子域创建一个新数据库。 我知道我可以在这里使用_context.Database.Migrate() ,但它似乎只能在 Startup & Program 类中使用。

当程序已经运行时,我该怎么做? 因为我只能在应用程序运行时获取子域

这是我尝试过的:

// Db Context
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
{
     // _ecosystemServices.GetSubdomain gets the domain
     var subdomain = _ecosystemServices.GetSubDomain(_accessor);

     // _ecosystemServices.GetConnectionString returns the appropriate connection  string based on the subdomain
     optionsBuilder.UseSqlServer(_ecosystemServices.GetConnectionString(subdomain));         

     // Attempting to create the database
     _context.Database.Migrate();
}

但这不起作用,我得到一个循环依赖错误。 我应该怎么办?

提前致谢。

使用 EF Core,您可以使用以下之一

context.Database.Migrate()

或者

context.Database.EnsureCreated(),

其中contextDbContext

您在哪里调用这些取决于您的应用程序的逻辑,但在OnConfiguring()绝对不是正确的位置,因为当必须创建数据库时,EF 首先创建 model 并因此调用OnConfiguring() 因此,您应该收到堆栈溢出消息。

至于循环依赖,我无法判断,但 C# 编译器太聪明了,会将可能的堆栈溢出转换为循环依赖(坦率地说,我对此表示怀疑),或者错误的根源来自其他地方。

但是,您应该注意Migrate()EnsureCreatd()之间的区别。 第二个不会在您的代码中应用迁移。 这是Rowan MillerGithub中两种方法的类似问题的回答:

您可以调用 EnsureCreated() 或 Migrate()。 EnsureCreated() 是一种替代方法,它完全跳过迁移管道,只创建一个与您当前的 model 匹配的数据库。 当 model 发生变化时,当您很高兴删除并重新创建数据库时,这对于单元测试或非常早期的原型设计很有用。

您可以将所有代码替换为 db.Database.Migrate();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM