.net 关于生产数据库上的迁移技术的问题,这些技术似乎令人困惑

xytpbqjk  于 2023-06-07  发布在  .NET
关注(0)|答案(1)|浏览(211)

我使用C#,.NET和EF Core/SQL作为数据层。
我读过一本关于EF Core的书和一本关于TSQL的书,现在我对生产系统上的迁移技术的某些方面感到困惑。
我的问题是:

  • 我读到过这样一个事实,即您可以使用script migration -idempotent来获取新的/适用的迁移脚本,并考虑到EFMigration_History表中的最后一个迁移。在书中,它说你需要一个工具,如DbUp或RedGate的flyaway,以运行此脚本。你就不能用MSSMS来做吗?还是VS SQL Server Explorer的New Query
  • 还有一种技术,被认为是一种简单的技术,你可以在你的解决方案中创建一个控制台应用程序,这个控制台应用程序只包含context.Database.Migrate,这样它就可以在你调用它的时候运行,并将新的迁移应用到一个停止的应用程序或一个正在运行的应用程序,并进行一些其他调整,这非常令人困惑,因为也许我根本不理解这一点,但是当代码是活的时,你不能调用/运行一个解决方案的项目,并对生产系统产生影响,对吗?如果是这样,你知道这个技术到底是什么吗?
  • 您是否建议使用SQL脚本来构建迁移?使用SQL数据库比较工具来生成从当前数据库模式到所需数据库模式的迁移,看起来你需要很好的SQL知识,但我还不算太差。

我想知道你的建议,以了解什么是我最好的赌注,在不打破我的生产系统,提前计划,并确保我知道该做什么之前,我必须重新做一切。

4szc88ey

4szc88ey1#

下面是运行迁移的代码,它将输出迁移运行的成功和错误。你应该可以在它的基础上进行建设。

protected virtual void RunMigrations(String connectionString)
        {
            Console.WriteLine($"\n ---- Running migrations for [{connectionString}]");

            var dbContext = GetDbContext(connectionString);

            var pendingMigrations = dbContext.Database.GetPendingMigrations();
            var latestMigration = pendingMigrations.OrderByDescending(t => t).FirstOrDefault();

            try
            {
                if (pendingMigrations.Any())
                {
                    Console.WriteLine("Running migrations \n - {0}", String.Join("\n - ", pendingMigrations));

                    dbContext.Database.Migrate();

                    Console.WriteLine("Migrations completed...........................");
                }
                else
                {
                    Console.WriteLine("No pending migrations.");
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                var successfulMigrations = pendingMigrations.Intersect(dbContext.Database.GetAppliedMigrations());
                var unsuccessfulMigrations = pendingMigrations.Except(successfulMigrations);

                if (unsuccessfulMigrations.Any())
                {
                    Console.WriteLine("Failed to apply the following migrations \n - {0}", String.Join("\n -", unsuccessfulMigrations));
                }
            }
            Console.WriteLine("--------------------------------------------------------------------------------");
        }

相关问题