我的应用程序正在被移植到。NET core,它将使用新的EF core和SQLite。我想在应用程序第一次运行时自动创建数据库和表结构。根据EF核心文档,这是使用手动命令完成的
dotnet ef migrations add MyFirstMigration
dotnet ef database update
然而,我不希望最终用户输入这些命令,更希望有应用程序创建和设置数据库的第一次使用。对于EF 6,有如下功能
Database.SetInitializer(new CreateDatabaseIfNotExists<MyContext>());
但在EF Core,这些似乎并不存在。我找不到任何关于EF core等效的例子或文档,而且EF core文档中的缺失特性列表中也没有提到它。我已经有了模型类设置,所以我可以编写一些代码来根据模型初始化数据库,但是如果框架自动这样做会更容易。我不想自动构建模型或迁移,只是在一个新的数据库上创建表结构。
我是遗漏了什么,还是EF核心中的自动创建表功能缺失了?
如果您已经创建了迁移,则可以在startup.cs中执行它们,如下所示。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
context.Database.Migrate();
}
...
这将使用添加的迁移创建数据库和表。
如果您不使用实体框架迁移,而是只需要在第一次运行时创建与context类完全相同的DbContext模型,那么您可以使用:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
context.Database.EnsureCreated();
}
...
取而代之的是。
如果您需要在确保数据库已创建之前删除它,请调用:
context.Database.EnsureDeleted();
在调用Ensurecreated()
之前
改编自:http://docs.identityserver.io/en/latest/quickstarts/7_entity_framework.html?highlight=实体
我的答案与Ricardo的答案非常相似,但我觉得我的方法更简单一些,因为他的using
函数中有太多内容,以至于我甚至不确定它在较低级别上的工作原理。
因此,对于那些想要一个简单而干净的解决方案的人来说,这个解决方案可以为您创建一个数据库,让您确切地知道在引擎盖下面发生了什么,这是为您准备的:
public Startup(IHostingEnvironment env)
{
using (var client = new TargetsContext())
{
client.Database.EnsureCreated();
}
}
这基本上意味着在您创建的DBContext
(在本例中,我的代码称为TargetsContext
)中,您可以使用DBContext
的实例来确保在应用程序中运行Startup.cs时创建类中定义的表。
如果通过startup.cs中Configure的参数列表获取上下文,则可以改为执行以下操作:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, LoggerFactory loggerFactory,
ApplicationDbContext context)
{
context.Database.Migrate();
...