Непонятное поведение DbContext.Database.EnsureCreated в EF Core 2.1 - PullRequest
0 голосов
/ 04 октября 2018

Я разрабатываю некоторый код, основанный на учебнике, найденном по адресу https://docs.microsoft.com/en-us/aspnet/core/data/ef-rp/intro?view=aspnetcore-2.1&tabs=visual-studio. В частности, я смотрю на следующий фрагмент в файле Program.cs.

public static void Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;

        try
        {
            var context = services.GetRequiredService<SchoolContext>();
            context.Database.EnsureCreated();
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred creating the DB.");
        }
    }

    host.Run();
}

Я использую ContosoМодель данных университета, представленная в руководстве, с ConnectionString, определенной в файле appSettings.json с использованием localdb.Я изменил код следующим образом:

public static void Main(string[] args)
{
    var host = CreateWebHostBuilder(args).Build();

    using (var scope = host.Services.CreateScope())
    {
        bool dbCreated = false;
        var services = scope.ServiceProvider;

        try
        {
            var context = services.GetRequiredService<SchoolContext>();
            dbCreated = context.Database.EnsureCreated();
            if (dbCreated) DbInitializer.Initialize(context);
        } // end try
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred creating the DB.");
        } // end catch (Exception ex)

    } // end using (var scope = host.Services.CreateScope())

    host.Run();
} // end public static void Main(string[] args)

Наблюдаемое мной поведение касается переменной dbCreated, инициализированной как false.Если база данных отсутствует, она создается, и вызов EnsureCreated возвращает значение true.Если он существует, остается неизменным (false).Я не ожидал такого поведения.Я ожидаю, что вызов вернет true, если база данных уже существует или если она была успешно создана.Если создание не удастся, оно вернет false или выдаст исключение или оба.В EF5 был вызов context.Database.Exists ().См. Код Entity Framework. Первая проверка. База данных существует .Похоже, что это не доступно в EF Core 2.1.У меня два вопроса:

  1. Как проверить наличие базы данных в EF Core 2.1?

  2. Можно ли предположить, что база данных существует?после вызова EnsureCreated без проверки возвращаемого значения?

1 Ответ

0 голосов
/ 04 октября 2018

Я ожидаю, что вызов вернет true, если база данных уже существует или если она> успешно создана.

.,.

Если создание завершится неудачно, будет возвращено false или будет сгенерировано исключение или оба.

Это нарушит рекомендации по проектированию .NET API:

XНЕ возвращайте коды ошибок.
Исключения являются основным средством сообщения об ошибках в каркасах.
✓ НЕ сообщайте о сбоях выполнения, выдавая исключения.

https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/exception-throwing

Можно ли предположить, что база данных существует после вызова EnsureCreated без проверки возвращаемого значения?

Да.

...