.net core 使用EF Core 2.2设定变量数据

.net core 使用EF Core 2.2设定变量数据,.net-core,entity-framework-core,.net Core,Entity Framework Core,在我看到的所有关于使用EF Core播种数据的示例和文章中,所有数据都是硬编码的。我有一个需要种子一些数据的一部分是可变的。我的模型是: public class Customer { [Key] public Guid Id { get; set; } public string ApiKey { get; set; } } 具体来说,我希望每次运行种子操作时,ApiKey包含不同的值。这样,我可以为每个环境(开发、QA、生产)获得不同的价值 我创建了一个生成唯一值

在我看到的所有关于使用EF Core播种数据的示例和文章中,所有数据都是硬编码的。我有一个需要种子一些数据的一部分是可变的。我的模型是:

public class Customer
{
    [Key]
    public Guid Id { get; set; }

    public string ApiKey { get; set; }
}
具体来说,我希望每次运行种子操作时,
ApiKey
包含不同的值。这样,我可以为每个环境(开发、QA、生产)获得不同的价值

我创建了一个生成唯一值的方法,并将以下内容添加到我的
OnModelCreating
方法中

modelBuilder.Entity<Customer>().HasData(new Customer
{
    Id = Guid.NewGuid(),
    ApiKey = GenerateApiKey()
});
在EF6.x中,我使用我的
dbmigrationconfiguration
子类的
Seed
方法完成了这项工作


我意识到我可以修改迁移,但我们正处于开发阶段,在更改过程中删除并重新创建数据库,这需要每个开发人员在重新生成初始迁移时记住这一点。我宁愿让它更简单一点。

一旦你的主机准备好了,你就可以运行seed方法,就像这样(我在2.1中就是这样做的):

publicstaticvoidmain(字符串[]args)
{
CreateWebHostBuilder(args).Build().Seed().Run();
}
...
公共静态类WebHostExtensions
{
公共静态IWebHost种子(此IWebHost主机)
{
使用(var scope=host.Services.CreateScope())
{
var services=scope.ServiceProvider;
var loggerFactory=services.GetRequiredService();
var context=services.GetRequiredService();
//在迁移之前,在此处对数据执行任何需要的操作
...
Migrate();
//迁移后,您可以在此处对数据执行任何需要的操作
...
}
}
}
migrationBuilder.InsertData(
    table: "Customers",
    columns: new[] { "Id", "ApiKey" },
    values: new object[] 
    { 
        new Guid("bcde0c82-ad26-47fb-bd5f-1ad552d2b8f0"),
        "56+hhUTjPwz0FM9uwYg19M5rfq6aUgmNde15Frn6TFY=" 
    });
public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Seed().Run();
}

...

public static class WebHostExtensions
{
    public static IWebHost Seed(this IWebHost host)
    {
        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            var loggerFactory = services.GetRequiredService<ILoggerFactory>();
            var context = services.GetRequiredService<MsbContext>();

            // do whatever you need here with your data before migrations
            ...
            context.Database.Migrate();

            // do whatever you need here with your data after migrations
            ...
        }
    }
}