【问题标题】:Different seed for development and production用于开发和生产的不同种子
【发布时间】:2023-03-24 11:50:02
【问题描述】:

根据构建配置(调试/发布),使用实体框架 (6+) 以不同方式为数据库播种的推荐方法是什么?

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

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

【问题讨论】:

  • 你不能使用#if DEBUG预处理指令吗?或者引入你自己的构建配置。
  • 我在想这个。但是,我不确定这是否是要走的路。如果有什么我以前从未见过的东西,我常常会开始认为我可能错了。
  • 我肯定会这样做!
  • 我为此有一个 xml 文件 - 从 xml 读取数据,然后做种子。对不同的环境使用不同的种子 xml。

标签: entity-framework


【解决方案1】:

有很多可能性

  1. 预处理器指令

就像你和 Gert Arnold 已经讨论过的一样,使用 #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
}
  1. 配置

另一种方法是在 appsettings.json 中进行配置,也许您想使用开发数据设置应用程序,您可以添加类似

{ "environment" : "development" }

并在种子中检查以下内容:

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" },
        );
    }
}
  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();
    }
}

【讨论】:

  • 注意:我之前在这里发布了一个答案,实际上没有用,我已经删除了它。对于 DbContext HasData 的用户,有条件地包含“HasData”语句是行不通的。一旦生成了迁移脚本(包括数据),无论模型构建器做什么,它都会为生产提供种子。
猜你喜欢
  • 2017-07-27
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2016-04-20
  • 2019-11-10
  • 2015-11-18
  • 2015-10-13
  • 1970-01-01
相关资源
最近更新 更多