Обновление данных с помощью миграции EF

Я хочу обновить новый столбец, который я создал в таблице, примерно так:

public partial class PortDealerTokens : DbMigration
{
    public override void Up()
    {
        IEnumerable<DealerAdapter> dealers;

        using (var context = new TestDriveContext())
        {
            dealers = context.Dealers.ToList();

        }

        foreach (var dealer in dealers)
        {
            using (var newContext = new TestDriveContext())
            {
                dealer.Token = < MyFunction >;

                newContext.SaveChanges();
            }
        }
    }

    public override void Down()
    {
    }
}

Этот код не работает, потому что, когда я вызываю Update-Database, возникают ошибки, говорящие о невозможности вставить повторяющийся ключ в объект 'dbo .__ MigrationHistory'. Повторяющееся значение ключа: (201812180729383_PortDealerTokens.

Как я могу решить эту проблему? Есть ли лучшая стратегия?

Может возникнуть проблема, если дважды запустить контекст во время миграции. Вы пытались переместить цикл foreach внутри первого, используя ...

Steve Greene 21.12.2018 16:40

Да, я попробовал. К сожалению без положительного результата. У меня такая же ошибка: stackoverflow.com/questions/53831052/…

Marcel Beeker 28.12.2018 16:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
1 548
1

Ответы 1

Вы можете сделать это с помощью переопределить метод семян или методом Sql в классе миграции

public partial class PortDealerTokens : DbMigration
{
    public override void Up()
    {
        //Sql script to populate your data   
        Sql("");
    }

    public override void Down()
    {
    }
}  

Обновлять

Однако у вас есть новая миграция или метод начального значения не запускается при запуске команды update-database. на этом изображении

1-add-migration 'имя миграции' - добавление новой пустой миграции

2-обновление базы данных - применяя эту миграцию, затем метод Running Seed

База данных 3-updata - нет ожидающих явных миграций, затем метод Running Seed.

Это решение не сработает. Я не могу указать это в сценариях миграции, потому что мне нужно вызвать свой метод в статусе Sql. Переопределение начального метода также не работает, потому что моя переопределенная начальная функция не будет вызываться, потому что я использую это в существующем проекте, в котором уже реализованы миграции. Есть другое решение?

Marcel Beeker 21.12.2018 08:28

однако у вас есть новая миграция или нет, метод seed будет запущен, при запуске update-database метод seed будет запущен после применения новых миграций, если нет новой миграции для запуска метода начального числа, поэтому убедитесь, что метод, который вы вызовете в методе seed, будет не повредить ваши данные

Ahmed Ghoniem 21.12.2018 14:02

Я пробовал это, и это сработало! Но метод seed всегда будет выполняться после Update-Database. Я хочу, чтобы этот метод начального значения выполнялся только один раз. Это возможно?

Marcel Beeker 28.12.2018 16:03

вы можете использовать раздел appsettings в web.config <add key = "ApplySeed" value = "true" /> // true или false защищенное переопределение void Seed (контекст Data.DBEntities) {строковое значение = ConfigurationManager.AppSettings ["ApplySeed"]; bool ApplySeed = Convert.ToBoolean (значение); if (ApplySeed) {// здесь ваш код}}

Ahmed Ghoniem 28.12.2018 20:04

Другие вопросы по теме