EF Core 2.1 HasData () создает удаление и повторную вставку для неизмененных объектов при последующих миграциях - PullRequest
0 голосов
/ 29 августа 2018

Обновление 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;
        }
    }
}

1 Ответ

0 голосов
/ 22 июля 2019

Эта проблема была ошибкой EF Core, которая была исправлена ​​ в EF Core 2.2.

...