Консольное приложение .Net Core - EF Core SaveChangesAsync () не передает обновления в базу данных - PullRequest
0 голосов
/ 14 ноября 2018

Чтобы протестировать уровень доступа к данным более широкого проекта, я написал простое консольное приложение в качестве тестового набора для вызова DAL.

Сохранение данных является двухэтапной операцией. Первый шаг - сохранить основную информацию из отчета и ДОЛЖЕН БЫТЬ успешным. Второй шаг - расшифровать необработанные данные в модели, а затем сохранить их, но если это не удастся, это не является большой проблемой и будет сообщили и адресовали позже.

Весь процесс должен выполняться асинхронно (это часть REST), но вызовы await _context.SaveChangesAsync() не выглядят ожидающими, и приложение завершается, и данные не сохраняются.

Ниже приведен упрощенный пример обновления БД

public async Task<bool> SubmitFlightReportAsync(string ReportData)
{
    try
    {
        // Save the primary data - MUST Succeed
        _logger.LogInformation("Saving primary data database ");
        Models.MyReport myRpt = new Models.MyReport()
        {
            Status = 1,
            RawData = ReportData
        };
        _context.MyReports.Add(myRpt);

        if (await _context.SaveChangesAsync() > 0)
        {
            _logger.LogInformation("Primary save complete");

            // Now update with all the extracted data - Optional Succeed
            try
            {
                _logger.LogInformation("Extracting secondary data");
                /*
                 * 
                 * Here is where we extract all the information from the Report Data 
                 * and update the Model, before saving
                 * 
                 */
                _logger.LogInformation("Saving extracted data");

                if (await _context.SaveChangesAsync() > 0)
                {
                    _logger.LogDebug("Secondary save complete");
                }

            }
            catch (Exception ex)
            {
                _logger.LogError("Error saving secondary data ");
            }
        }
        else
        {
            _logger.LogInformation("Primary save failed");
        }
    }
    catch (Exception ex)
    {
        _logger.LogCritcal("Something went horrobly wrong");
    }
}

.и вызывается из консольного приложения как такового ...

_logger.LogInformation("Starting application");
_fltSvc.SubmitFlightReportAsync("this is the report data as a string")
_logger.LogInformation("All done");

Когда я запускаю приложение, вот что регистрируется в журнале ...

object:Information: Starting application
object:Information: Saving primary data database

... Where's all the other logging messages?

object:Information: All done

Как видите, он доходит до точки первого SaveChangesAsync, немного ждет, как будто он что-то делает, а затем возвращается к основному потоку ..... и НЕТ ДАННЫХ не сохраняется в базы данных.

Я уверен, что это что-то довольно простое, но я просто вижу это ...

Спасибо.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Звоните SubmitFlightReportAsync в свою главную без ожидания, как показано ниже.

public static void Main(string[] args)
{
    Task t = SubmitFlightReportAsync("bla");
    t.Wait(); //This is the line you need to have when working with console apps.
}

Asyny и Await отличаются при использовании его в консольном приложении.

Или взгляните на следующее: Асинхронное консольное приложение в C #?

0 голосов
/ 15 ноября 2018

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

_logger.LogInformation("Starting application");
Task submitTask =
    Task.Run(() => _fltSvc.SubmitFlightReportAsync("this is the report data as a string"));
submitTask.Wait();
_logger.LogInformation("All done");

Если вы запускаете этот код из метода Main и используете C # 7.0 или выше, вы также можете просто создать там async Main и await:

static async void Main() {
    //...
    _logger.LogInformation("Starting application");
    await _fltSvc.SubmitFlightReportAsync("this is the report data as a string")
    _logger.LogInformation("All done");
    //...
}
...