ASP. NET Приложение Core 3.0 с Entity Framework Core зависает при заполнении БД без исключения - PullRequest
0 голосов
/ 09 апреля 2020

Со вчерашнего дня у меня возникла странная проблема с моим методом заполнения БД, и я не могу понять это.

Я создал класс для заполнения моей БД, зарегистрировал ее для DI и вызвал ее метод заполнения из автозагрузки. Настройка. Внутри я гарантирую, что БД создана, затем я генерирую данные для ее заполнения. Добавление первых нескольких наборов данных работает просто отлично. Однако в какой-то момент мне нужно добавить немного большее количество данных в таблицу (200 строк).

Я создал список для хранения записей и приступил к их добавлению, вызвав await _context.AddRange(List), а затем await _context.SaveChangesAsync(). Выполнение зависает при сохранении. Другие задачи, такие как фоновые, которые я регистрирую, все еще выполняются Также нет исключений. Если я изменю оба исполнения на их синхронные аналоги, это будет работать. Это заставляет меня думать, что у меня тупик. Но так как фоновая служба все еще работает, и я не могу отладить, что происходит в моем методе заполнения, я понятия не имею, может ли это вообще быть тупиком или нет.

Я мог бы просто go опередить и использовать синхронный звонки, но я чувствую, что я что-то здесь упускаю и, скорее всего, снова столкнусь с проблемой. Самое странное, что данные, которые я пытаюсь добавить в таблицу, только начинают замораживать выполнение после того, как я добавлю больше столбцов. Ранее я вызывал await _context.Add(data) во всех строках и только await _context.SaveChangesAsync() в конце. На тот момент таблица имела около 15 столбцов. Когда я расширил таблицу до 30 столбцов, эти и вышеупомянутые вызовы больше не работают. Единственным преимуществом для меня может быть увеличение количества данных, которое необходимо добавить, что повышает вероятность зайти в тупик, но в остальном у меня нет идей.

1 Ответ

0 голосов
/ 09 апреля 2020

Я создал класс для заполнения моей БД, зарегистрировал ее для DI и вызвал ее метод заполнения из Startup.Configure.

Вы не должны ничего запускать в Startup.Configure, не говоря уже о чем-то асин c. Если вам нужно запустить что-то при запуске приложения, сделайте это в вашем Program.Main, и, поскольку это asyn c, вам нужно переключиться на использование asyn c Main:

public static async Task Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();

    var seed = host.Services.GetRequiredService<SeedClass>();
    await seed.SeedAsync();

    await host.RunAsync();
}

Тем не менее, это не тот способ, которым вы должны сеять с EF, независимо от того. Начиная с EF 2.1, вы засеиваете через HasData в OnModelCreating:

modelBuilder.Entity<Blog>().HasData(new Blog {BlogId = 1, Url = "http://sample.com"});

Подробнее см. документы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...