Обновление 8/29/18
Просмотр этой проблемы также во встроенном new
-изображении начальных данных. Открыт EF Core выпуск . Обновлю вопрос с любыми выводами.
Я пытаюсь использовать Механизм заполнения EF Core 2.1 . Однако я хочу загрузить начальные данные из плоских файлов 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;
}
}
}