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

时间:2018-08-28 22:36:58

标签: c# entity-framework-core seeding

更新8/29/18

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


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

问题是,即使添加了后续迁移,即使不更改模型,配置或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;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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