如果某些表已创建,Database.EnsureCreated 将不起作用

问题描述 投票:0回答:1
  1. 第一步:设置空数据库: Empty DB Screenshot

  2. 设置所有上下文。

    accessTokenContext.Database.EnsureCreated();
    userContext.Database.EnsureCreated();
    userGroupContext.Database.EnsureCreated();
    permissionContext.Database.EnsureCreated();
    roleContext.Database.EnsureCreated();
    

    所有代码:https://pastebin.com/DZVKnGx9

  3. 启动 API 并发出第一个请求后: DB After Screenshot

  4. 它只创建了一些表。

我希望它创建所有表。然而它只创造了 4 个。

c# asp.net entity-framework asp.net-core
1个回答
0
投票

您对所有 DbContext 使用相同的数据库(connectionString)。但

EnsureCreated()
只是检查数据库是否不存在,它将创建。因此,在第一个
accessTokenContext.Database.EnsureCreated();
之后,它将识别为数据库已存在,因此不会再创建。 (这里可能会出现一些延迟情况)。

因此您不能将

EnsureCreated()
用于同一数据库中的多个上下文。相反,您可以尝试以下解决方法。

accessTokenContext.Database.EnsureCreated();

try
{
    RelationalDatabaseCreator databaseCreator2 = (RelationalDatabaseCreator)accessTokenContext.Database.GetService<IDatabaseCreator>();
    databaseCreator2.EnsureCreated();
}
catch { }
try
{
    RelationalDatabaseCreator databaseCreator3 = (RelationalDatabaseCreator)userGroupContext.Database.GetService<IDatabaseCreator>();
    databaseCreator3.CreateTables();
}
catch { }
try
{
    RelationalDatabaseCreator databaseCreator4 = (RelationalDatabaseCreator)permissionContext.Database.GetService<IDatabaseCreator>();
    databaseCreator4.CreateTables();
}
catch { }
try
{
    RelationalDatabaseCreator databaseCreator5 = (RelationalDatabaseCreator)roleContext.Database.GetService<IDatabaseCreator>();
    databaseCreator5.CreateTables();
}
catch { }

说明:“RelationalDatabaseCreator”仅适用于现有数据库,因此使用“EnsureCreated”来确保数据库存在。当表已经存在时,“RelationalDatabaseCreator”将会出现异常,因此将它们放在“try catch”中

© www.soinside.com 2019 - 2024. All rights reserved.