Entity Framework 核心代码优先在生成迁移时执行其他操作

Entity Framework Core code-first perform additional actions when generating migrations

我想保留对 EF Core 生成的所有 table 所做更改的历史记录。

我可以通过为每个我想复制的模型手动创建第二个模型来做到这一点,但我想知道是否有任何方法可以自动执行此操作。

我希望它做的是,每次生成包含 CreateTable 调用的迁移时,创建 table 的副本,并在名称后附加类似“历史”的内容,以及与原始记录相关的附加列。

我不确定实现此目标的最佳方法是什么,因为我对 ASP.NET 还不是很有经验。我正在考虑覆盖 MigrationBuilder.CreateTable 方法,但我不知道如何让实际的迁移构建器使用我覆盖的方法。

如果我理解正确,您想在 运行 迁移之前执行自定义 SQL 脚本。

嗯,确实可以。

您将像现在一样生成迁移,您将得到如下内容:

public partial class MyMigration: Migration
            {
                protected override void Up(MigrationBuilder migrationBuilder)
                {
                   //auto-generated mappings
                }
        
            }

在 auto-generate 调用之前,您可以像这样插入自己的 SQL 脚本:

   public partial class MyMigration: Migration
                {
                    protected override void Up(MigrationBuilder migrationBuilder)
                    {
                        migrationBuilder.Sql("CREATE TABLE Customers_History (CustomerName, City, Country)");

                        migrationBuilder.Sql("INSERT INTO Customers_History (CustomerName, City, Country) SELECT CustomerName, City, Country FROM Customers)");

                       //auto-generated mappings
                    }
        
            }

这只是一个示例,但您可以添加自己的 SQL 以匹配您的场景。

使用此解决方案,您无需创建其他模型。

请注意 SQL 确实支持临时表,它会在内部为您创建第二个 table。它有 start/end 个时间列,而不是单个列。数据库引擎会为您维护它(这意味着即使是临时 sql 不通过 EF 的查询也会正确地跟踪到历史记录 table 中)。这是 ANSI SQL 标准的一部分,因此您可能会发现这比自己动手更容易。您可以阅读有关这些内容的更多信息 on the MSFT documentation page