不同的种子用于开发和生产

Sam*_*Sam 5 entity-framework

根据构建配置(调试/发布),使用Entity Framework(6+)以不同方式为数据库设定种子的建议方法是什么?

现在我正在使用MigrateDatabaseToLatestVersion初始化程序.在开发过程中,我喜欢在我的数据库中有假数据进行测试.所以我在Configuration类的Seed方法中创建了这个测试数据(首先是启用代码).但是,每次我通过构建服务器发布产品时,我必须在我的种子方法中注释很多代码,提交它,创建发布,然后撤消所有注释以继续使用测试数据进行开发.

我想这不是要走的路.所以我希望你能告诉我正确的方法.

Mat*_*ger 9

有很多可能性

  1. 预处理指令

一个像你和格特阿诺德已经谈过,使用#if DEBUG:

protected override void Seed(BookService.Models.BookServiceContext context)
{
#if DEBUG
    context.Authors.AddOrUpdate(x => x.Id,
        new Author() { Id = 1, Name = "Test User" },
    );
#else
    context.Authors.AddOrUpdate(x => x.Id,
        new Author() { Id = 1, Name = "Productive User" },
    );
#endif
}
Run Code Online (Sandbox Code Playgroud)
  1. 组态

另一种方法是使用appsettings.json中的配置,也许你想用开发数据设置应用程序,你可以添加像

{ "environment" : "development" }
Run Code Online (Sandbox Code Playgroud)

在种子中你检查这个:

protected override void Seed(BookService.Models.BookServiceContext context)
{
    var builder = new ConfigurationBuilder();
    builder.AddInMemoryCollection();
    var config = builder.Build();

    if (config["environment"].Equals("development"))
    {
        context.Authors.AddOrUpdate(x => x.Id,
            new Author() { Id = 1, Name = "Test User" },
        );
    }
    else if (config["environment"].Equals("producion"))
    {
        context.Authors.AddOrUpdate(x => x.Id,
            new Author() { Id = 1, Name = "Productive User" },
        );
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 环境变量(asp net core的解决方案)

(另见https://docs.asp.net/en/latest/fundamentals/environments.html)

您可以添加环境变量

在此输入图像描述 然后通过DI:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        SeedDataForDevelopment();
    }
}
Run Code Online (Sandbox Code Playgroud)