C# 使用实体框架3.0和模型或迁移播种数据?
使用最新的ASP.NET Core 3和EF Core 3,我希望像在以前版本的EF中一样对数据进行种子设定。我注意到,在Microsoft文档中,他们将此代码作为如何播种的示例 它使用如下代码更新迁移:C# 使用实体框架3.0和模型或迁移播种数据?,c#,.net-core,entity-framework-core,asp-net-core-spa-services,C#,.net Core,Entity Framework Core,Asp Net Core Spa Services,使用最新的ASP.NET Core 3和EF Core 3,我希望像在以前版本的EF中一样对数据进行种子设定。我注意到,在Microsoft文档中,他们将此代码作为如何播种的示例 它使用如下代码更新迁移: migrationBuilder.InsertData( table: "Posts", columns: new[] { "PostId", "BlogId", "Content", "Title", "AuthorName_
migrationBuilder.InsertData(
table: "Posts",
columns: new[] { "PostId", "BlogId", "Content", "Title", "AuthorName_First", "AuthorName_Last" },
values: new object[] { 1, 1, "Test 1", "First post", "Andriy", "Svyryd" });
migrationBuilder.InsertData(
table: "Posts",
columns: new[] { "PostId", "BlogId", "Content", "Title", "AuthorName_First", "AuthorName_Last" },
values: new object[] { 2, 1, "Test 2", "Second post", "Diego", "Vega" });
这对我来说似乎“不舒服”,因为我学会初始化所有数据和表的方法是删除我的migrations文件夹,然后重新创建数据库。如果我手动更新迁移,那么我将永远保留此迁移
是否有更好的方法处理EF Core 3中的种子数据?可能使用dbContext,或者以某种方式将某些内容放入模型类本身?您可以在Program.cs中播种数据。像下面这样
公共静态异步任务主(字符串[]args)
{
var host=CreateHostBuilder(args.Build();
使用(var scope=host.Services.GetRequiredService().CreateScope())
{
等待SeedData.EnsuresedData(scope.ServiceProvider);
}
host.Run();
}
创建一个类SeedData并在其中编写种子设定逻辑
公共静态异步任务EnsuresedData(IServiceProvider提供程序)
{
var dbContext=provider.GetRequiredService();
等待dbContext.Database.MigrateAsync();
如果(!await dbContext.MyTables.AnyAsync())
{
等待dbContext.MyTables.AddAsync(新MyTable{})
等待dbContext.saveChangesSync();
}
}
为什么要使用服务提供商?为什么我们不能在Main本身中实例化MyDbContext?@kotpal,因为我们通常在启动时注册Dbcontext。因此,它可以使用我们在那里指定的连接字符串和我们在那里使用的任何其他选项。更重要的是,如果您在单独的类库中进行迁移,我们还需要在选项中指定程序集名称。您可以在main中初始化Dbcontext,但也需要在此处复制所有选项。Ok。我将研究如何使用ServiceProvider。现在我确实在复制这些选项,因为我不希望API使用的DbContext必须经过迁移和种子代码。因此,我将迁移和种子植入到它们自己的程序集中,并实现IDesignTimeDbContextFactory。我还使用CLI插入数据(如从JSON创建的POCO,但没有ID)。种子设定需要ID,我使用种子设定来添加应用程序/系统数据。