EF Core 2.1中的DbContext.Database.EnsureCreate令人困惑的行为

时间:2018-10-04 19:01:09

标签: c# .net-core entity-framework-core

我正在根据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 University数据模型,并使用localdb在appSettings.json文件中定义了ConnectionString。我将代码修改如下:

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有关。如果数据库不存在,则会创建该数据库,并确保SecureCreated调用返回true。如果存在,则保持不变(假)。我没想到这种行为。如果数据库已经存在或成功创建,我希望该调用将返回true。如果创建失败,它将返回false或引发异常或同时发生这两种情况。在EF5中,有一个调用context.Database.Exists()。参见Entity Framework Code First check Database exist。 EF Core 2.1中似乎不提供此功能。我有两个问题:

  1. 如何检查EF Core 2.1中数据库的存在?

  2. 可以安全地假设在调用SecureCreated之后数据库没有检查返回值吗?

1 个答案:

答案 0 :(得分:1)

  

如果数据库已经存在或成功创建,我希望调用将返回true。

     

。 。

     

如果创建失败,它将返回false或引发异常,或两者同时发生。

这将违反.NET API设计指南:

  

X不返回错误代码。
  例外是   报告框架中的错误。
  ✓通过以下方式报告执行失败   引发异常。

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

  

是否可以安全地假设在调用SecureCreated之后不检查返回值就存在数据库?

是的