我正在根据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中似乎不提供此功能。我有两个问题:
如何检查EF Core 2.1中数据库的存在?
可以安全地假设在调用SecureCreated之后数据库没有检查返回值吗?
答案 0 :(得分:1)
如果数据库已经存在或成功创建,我希望调用将返回true。
。 。
如果创建失败,它将返回false或引发异常,或两者同时发生。
这将违反.NET API设计指南:
X不返回错误代码。
例外是 报告框架中的错误。
✓通过以下方式报告执行失败 引发异常。
https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/exception-throwing
是否可以安全地假设在调用SecureCreated之后不检查返回值就存在数据库?
是的