7

我正在尝试在已经创建数据库的现有系统上构建一个 aspnetcore 应用程序,并且我将在其上添加一些表。

我已经对数据库进行了逆向工程,以将现有表作为实体添加到我的应用程序中,并且我已经编写了自己的实体,稍后将添加这些实体。最后,将所有实体添加到单个 DbContext。

我的要求如下:

  • 我想为新添加的实体启用代码优先迁移
  • 我不希望对已经存在的表/实体进行迁移

注意:我不想接触生成的迁移代码。

有没有合适的方法来处理这种情况?

4

2 回答 2

6

有没有合适的方法来处理这种情况?

编辑迁移代码是处理这种情况的正确方法。

或者,您可以创建一个带有迁移的 DbContext,其中仅包含映射到要使用迁移管理的表的实体。然后使用所有用于读取和写入数据库的实体创建另一个 DbContext。

请注意,如果您不想在数据库中添加引用不受迁移控制的表的真正外键,则您的迁移上下文可能缺少导航属性,仅包含相应的外键属性。

于 2019-02-07T14:22:01.063 回答
5

如果在添加迁移操作后通过检查命令行参数调用实体构建器,您可以忽略该实体;

public void Configure(EntityTypeBuilder<YourEntity> builder)
{
    //all properties to be mapped...

    //ignored when adding a new migration
    builder.HasOne(p => p.EntityDetail)
        .WithOne()
        .HasForeignKey<Entity>(x => x.Id)
        .IsRequired(false);

    if (MigrationHelper.IsMigrationOperationExecuting())
        builder.Ignore(x => x.EntityDetail);
}

public static class MigrationHelper
{
    public static bool IsMigrationOperationExecuting()
    {
        var commandLineArguments = Environment.GetCommandLineArgs();
        string[] orderedMigrationArguments = { "migrations", "add" };

        for (var i = 0; i <= commandLineArguments.Length - orderedMigrationArguments.Length; i++)
        {
            if (commandLineArguments.Skip(i).Take(orderedMigrationArguments.Length).SequenceEqual(orderedMigrationArguments))
                return true;
        }

        return false;
    }
}
于 2020-06-09T11:08:51.400 回答