【问题标题】:Seeding data for a particular environment in Entity Framework Core 2.1在 Entity Framework Core 2.1 中为特定环境播种数据
【发布时间】:2018-12-04 05:20:02
【问题描述】:

我在 EF Core 2.1 中使用新的数据播种方式,我只想为开发环境播种数据。

最初我尝试过这个:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") != EnvironmentName.Development)
    {
        return;
    }

    modelBuilder.Entity<Customer>().HasData(new Customer { ... });
}

但是,我注意到生成的迁移总是会将客户插入到数据库中。

有没有办法在每个环境的基础上限制数据种子?

【问题讨论】:

  • 这是播种数据还是创建表?
  • @viveknuna 这是播种数据。应为所有环境创建表。只能为开发环境添加种子数据。
  • @ChaoticNadirs 你找到什么好的解决方案了吗?
  • 如果您按照this 其他 SO 文章设置 ASPNETCORE_ENVIRONMENT,您的解决方案将有效

标签: c# asp.net-core entity-framework-core


【解决方案1】:

这有点老了,但我所做的是创建从Startup.cs 调用的扩展方法,并根据数据库是否存在,为其播种。我还将那个调用包装在一个环境中 如果数据库已经存在,则不会发生数据库的播种,但是,我相信这种行为很好,因为数据库已经存在,您很可能不在开发环境中。

public static class Extensions
{
    public static void UseDbSeeding(this IApplicationBuilder app)
    {
        var factory = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>();
        using var serviceScope = factory.CreateScope();
        var context = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
        if(context.Database.EnsureCreated()) // false when db already exists
        {
            // Seed here
            context.SaveChanges();
        }
    }
}

来自Startup.cs

public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 
{
    if (env.IsDevelopment())
    {
        app.UseDbSeeding();
    }
}

【讨论】:

    【解决方案2】:

    我认为你可以在 Startup.cs 中的 ConfigureServices 方法中这样做

    if (env.IsDevelopment())
       // then seed data
    

    这是在 Asp.Net Core 中播种数据的推荐方法(请注意,我不是在这里检查环境)。请看我的样品here

    this 文件将用于运行时种子

    【讨论】:

    • DbContext 应更改构造器并注入 IHostingEnvironment
    猜你喜欢
    • 1970-01-01
    • 2019-05-06
    • 2021-06-30
    • 1970-01-01
    • 2017-12-22
    • 2020-05-23
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多