【发布时间】:2021-03-12 11:29:37
【问题描述】:
在我的项目中,我有 2 个数据库:一个是我的自定义数据库,另一个是 ApplicationDbContext Microsoft Identity 给我的。
在我的Startup.cs 我有这个代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ApplicationDbContext db, MyContext dbPSC)
{
// ...
db.Database.EnsureCreated();
db.Database.Migrate();
dbPSC.Database.EnsureCreated();
dbPSC.Database.Migrate();
}
不知道什么时候有迁移迁移,对吧?然后,我有 2 个错误:
-
ApplicationDbContext的迁移在除第一次之外的每次应用程序启动时都会引发错误 - 我的上下文的迁移似乎很好
最佳实践是什么?是否需要为ApplicationDbContext调用迁移?
更新
我已删除 Migration 文件夹。然后,改成Startup.cslike
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ApplicationDbContext db, MyContext dbPSC)
{
// ...
db.Database.EnsureCreated();
dbPSC.Database.EnsureCreated();
}
但是当应用程序启动时,它根本不会创建任何表。 AuditDbContext是因为我用Audit.net
public class MyContext : AuditDbContext
{
public MyContext(DbContextOptions<MyContext> options) : base(options) { }
public DbSet<Message> Messages { get; set; }
public DbSet<AuditMessage> Audit_Messages { get; set; }
#region Common Tables
public DbSet<Country> Countries { get; set; }
public DbSet<AuditCountry> Audit_Countries { get; set; }
#endregion
#region Seed
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Seed();
}
#endregion
}
更新 #2
我尝试了另一种解决方案,但它不起作用。解决方法是使用RelationalDatabaseCreator,如下代码
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ApplicationDbContext db, MyContext dbPSC)
{
// ...
db.Database.EnsureCreated();
dbPSC.Database.EnsureCreated();
RelationalDatabaseCreator databaseCreator =
(RelationalDatabaseCreator)context.Database.GetService<IDatabaseCreator>();
databaseCreator.CreateTables();
}
作为Migrate(),应用程序第一次运行时会创建表,但第二次会引发错误,因为表已存在于数据库中。
【问题讨论】:
-
您看到了什么具体错误?你在使用 MS SQL 数据库吗?例如,因为某些迁移在 Sqlite 上往往会失败。顺便说一句,
EnsureCreated()不只是创建数据库;它还根据模型的当前状态(忽略迁移)创建整个数据库模式。 -
我正在使用 MSSQL。我不明白什么时候必须调用迁移。有没有办法检测应用程序是否需要运行迁移?
-
我更新了答案;希望它有用。随意添加更多问题;我打字很快。 :)
-
我已经阅读了问题中的更新,但问题很明显。如果数据库已经存在,
EnsureCreated不会做任何事情。当您使用RelationalDatabaseCreator.CreateTables()(顺便说一句,文档明确不建议在应用程序代码中使用)时,它预计数据库中没有表(文档中也提到了)。坦率地说,您遇到这些问题的原因是您以奇怪的方式使用 EF Core。 :) 但是如果你坚持这样使用它,你可能会忽略CreateTables()抛出的异常,使用空的 try/catch。 -
奇怪的方式是什么意思? EF Core 必须在应用程序正常启动时创建表。
标签: asp.net-core entity-framework-core microsoft-identity-web