更新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;
}
}
}