我正在编写本教程Getting Started with ASP.NET Core and Entity Framework Core using Visual Studio,我想从GitHub存储库将其部署到Azure。在Azure中使用“Web App + SQL”我可以成功部署一次,但是当我对数据库进行更改并重新部署时,我得到错误,“应用现有迁移可能会解决此问题...”
当使用新的迁移重新部署应用程序时,有什么方法可以触发数据库更新?
请注意,我知道有很多方法可以直接从Visual Studio部署和管理这样的应用程序,但我想学习如何从存储库中进行操作。
注意:我发现了这个similar question,我尝试将context.Database.Migrate()
添加到DbInitializer.Initialize(context);
下面的Startup.cs的Configure方法中,这在我运行它时没有出现问题机器,但当我部署它时,我得到“500内部服务器错误:启动应用程序时出错。”
答案 0 :(得分:1)
我尝试将context.Database.Migrate()添加到DbInitializer.Initialize(context)下面的Startup.cs的Configure方法中;当我在我的机器上运行它时,这并没有造成问题,但是当我部署它时,我得到了" 500内部服务器错误:启动应用程序时出错。"
根据您的说明,我按照您提到的tutorial来测试此问题。我在此section中添加了DbInitializer.cs
,并在context.Database.Migrate()
的配置方法下添加Startup.cs
,如下所示:
DbInitializer.Initialize(context);
context.Database.Migrate();
我为Student类添加了一个名为IdNo
的新属性,然后启动了Web应用程序,我可能会遇到以下错误:
注意:如果Students
表没有任何记录,DbInitializer.cs
会添加Feed记录,那么我会遇到上述错误。
以下是DatabaseFacade.EnsureCreated()
和DatabaseFacade.Migrate()
的摘要:
<强> DatabaseFacade.EnsureCreated()强>
确保上下文的数据库存在。如果存在,则不执行任何操作 取即可。如果它不存在,则创建数据库及其所有模式。 如果数据库存在,则不会努力确保它与之兼容 这种背景的模型。 请注意,此API不使用迁移来创建数据库。此外,以后无法使用迁移更新创建的数据库。 如果您要定位关系数据库并使用迁移,则可以使用DbContext.Database.Migrate()方法来确保创建数据库并应用所有迁移。
<强> DatabaseFacade.Migrate()强>
将上下文的任何挂起的迁移应用于数据库。如果数据库尚不存在,将创建数据库。请注意,此API与DbContext.Database.EnsureCreated()互斥。 EnsureCreated不使用迁移来创建数据库,因此也不会 创建的数据库以后无法使用迁移进行更新。
根据您的方案,您需要利用迁移功能来更新数据库架构。据我所知,EF Core不支持自动迁移,您可以遵循类似的case和此git issue。您可以在context.Database.Migrate()
中使用context.Database.EnsureCreated()
代替DbInitializer.cs
,并通过add-migration
手动添加迁移文件,并将创建的迁移文件提交到GitHub存储库。
注意:您需要处理DbInitializer.cs
中的种子数据,以避免插入相同的记录。