EF Core 2.1 HasData() 在后续迁移中为未更改的实体创建删除和重新插入

EF Core 2.1 HasData() creating deletes and re-inserts for unchanged entities on subsequent migrations

2018 年 8 月 29 日更新

在种子数据的内联 new 中也看到了这个问题。开了一个EF Core issue。将用任何发现更新问题。


我正在尝试使用 EF Core 2.1's seeding mechanism。但是,我想从 json 平面文件加载种子数据,而不是硬编码新的 C# 对象。我在下面编写了扩展方法,它在初始迁移时效果很好。它在 DataPath 中查找名为 [MyEntity].json 的文件并将它们反序列化为对象。

问题是,如果我添加后续迁移,即使不更改模型、配置或 json 文件中的任何内容,新迁移也会删除每个实体并再次重新插入它们。因此,Up() 包含一堆删除,然后是一堆相同数据的插入。我怀疑这是因为 EF Core 不够智能,无法识别它是一组相同的种子数据。

问题:

有没有一种方法可以使用 EF Core 2.1 为外部数据源(例如 json 文件)做种,而无需每次迁移都删除并重新插入数据?

我的播种扩展方法:

public static class ModelBuilderExtensions
{
    public static string DataPath { private get; set; } = "..\..\data";

    public static void Seed<TEntity>(this ModelBuilder modelBuilder) where TEntity : class, IBaseEntity
    {
        var entities = GetSeedRows<TEntity>();
        modelBuilder.Entity<TEntity>().HasData(entities);
    }

    private static TEntity[] GetSeedRows<TEntity>() where TEntity : IBaseEntity
    {
        try
        {
            return JsonConvert.DeserializeObject<TEntity[]>(
                File.ReadAllText(DataPath + Path.DirectorySeparatorChar + typeof(TEntity).Name + ".json"));
        }
        catch (FileNotFoundException e)
        {
            Console.WriteLine(e.Message);
            return null;
        }
    }
}

此问题是 EF Core 2.2 中 was resolved 的一个 EF Core 错误。