![](/img/trans.png)
[英]EF Core EnsureCreated() only creates the first DbContext
[英]Confusing Behavior of DbContext.Database.EnsureCreated in EF Core 2.1
我正在根据位于https://docs.microsoft.com/zh-cn/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()。 请参阅实体框架代码,首先检查数据库是否存在 。 EF Core 2.1中似乎不提供此功能。 我有两个问题:
如何检查EF Core 2.1中数据库的存在?
是否可以安全地假设在调用SecureCreated之后不检查返回值就存在数据库?
如果数据库已经存在或成功创建,我希望调用将返回true。
。 。 。
如果创建失败,它将返回false或引发异常或同时发生这两种情况。
这将违反.NET API设计指南:
X不返回错误代码。
异常是报告框架中的错误的主要方法。
✓通过抛出异常来报告执行失败。
https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/exception-throwing
是否可以安全地假设在调用SecureCreated之后不检查返回值就存在数据库?
是。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.