Entity Framework Core 2.2: отключение миграции для определенных сущностей

Я пытаюсь создать приложение aspnetcore поверх существующей системы, в которой база данных уже создана, и я собираюсь добавить несколько таблиц поверх нее.

Я реконструировал базу данных, чтобы добавить существующие таблицы в качестве сущностей в свое приложение, и я написал свои собственные сущности, которые будут добавлены позже. Наконец, все сущности добавляются в один DbContext.

Мое требование выглядит следующим образом:

  • Я хочу включить первую миграцию кода для вновь добавленных сущностей
  • Я не хочу, чтобы миграции выполнялись для уже существующих таблиц / сущностей

Примечание. Я предпочитаю не трогать сгенерированный код миграции.

Есть ли правильный способ справиться с этим сценарием?


person Haidar Zeineddine    schedule 07.02.2019    source источник
comment
Правильно ли вы пробовали это: docs.microsoft.com/en- us / ef / core / моделирование / включенные типы   -  person TanvirArjel    schedule 07.02.2019
comment
Я не смогу читать / писать в существующие модели   -  person Haidar Zeineddine    schedule 07.02.2019


Ответы (2)


Есть ли правильный способ справиться с этим сценарием?

Редактирование кода миграции - правильный способ справиться с этим сценарием.

В качестве альтернативы вы можете создать один DbContext с миграциями, содержащий только объекты, сопоставленные с таблицами, которыми вы хотите управлять с помощью миграций. Затем создайте еще один DbContext со всеми объектами, который используется для чтения и записи в базу данных.

Обратите внимание, что в вашем контексте миграции могут отсутствовать свойства навигации, содержащие только соответствующие свойства внешнего ключа, если вы не хотите добавлять реальные внешние ключи в базу данных, относящуюся к таблицам, не контролируемым вашими миграциями.

person David Browne - Microsoft    schedule 07.02.2019
comment
Я понял, что мне нужно создать DbContext, который соответствует только применению миграций и не должен использоваться для запросов к базе данных. Я прав? - person Haidar Zeineddine; 07.02.2019
comment
Ссылка на чужую таблицу с помощью внешнего ключа базы данных предотвратит операции DELETE и TRUNCATE TABLE, поэтому вы можете решить, что это слишком агрессивно. - person David Browne - Microsoft; 07.02.2019
comment
А как насчет игнорирования конструктором моделей ‹› метода - person Yazid; 31.05.2019
comment
ModelBuilder.Ignore полностью удалит объект из модели. Просьба просто исключить его из миграций. - person David Browne - Microsoft; 31.05.2019

Вы можете игнорировать сущность, если построитель сущностей вызывается после операции Добавить-перенос, проверяя аргументы командной строки;

public void Configure(EntityTypeBuilder<YourEntity> builder)
{
    //all properties to be mapped...

    //ignored when adding a new migration
    builder.HasOne(p => p.EntityDetail)
        .WithOne()
        .HasForeignKey<Entity>(x => x.Id)
        .IsRequired(false);

    if (MigrationHelper.IsMigrationOperationExecuting())
        builder.Ignore(x => x.EntityDetail);
}

public static class MigrationHelper
{
    public static bool IsMigrationOperationExecuting()
    {
        var commandLineArguments = Environment.GetCommandLineArgs();
        string[] orderedMigrationArguments = { "migrations", "add" };

        for (var i = 0; i <= commandLineArguments.Length - orderedMigrationArguments.Length; i++)
        {
            if (commandLineArguments.Skip(i).Take(orderedMigrationArguments.Length).SequenceEqual(orderedMigrationArguments))
                return true;
        }

        return false;
    }
}
person T.Y. Kucuk    schedule 09.06.2020