Entity Framework Core 2.2:禁用特定实体的迁移

7
我正在尝试在一个已有的系统上构建aspnetcore应用程序,该系统的数据库已经创建好了,我将在其中添加一些表。
我已经对数据库进行了反向工程处理,将现有表格作为实体添加到我的应用程序中,并编写了自己的实体,稍后将添加它们。最后,所有实体都添加到一个单独的DbContext中。
我的要求如下:
  • 我想为新增的实体启用Code First迁移
  • 我不希望对已经存在的表/实体进行迁移
注意:我不想修改生成的迁移代码。
是否有适当的方法来处理这种情况?

你尝试过这个链接吗:https://learn.microsoft.com/en-us/ef/core/modeling/included-types - TanvirArjel
1
我将无法读取/写入现有的模型。 - Haidar Zeineddine
2个回答

7
有没有适当的方法来处理这种情况?
编辑迁移代码是处理这种情况的适当方式。
或者,您可以创建一个包含仅映射到要使用迁移管理的表的实体的迁移的DbContext。然后创建另一个DbContext,其中包含所有实体,用于读取和写入数据库。
请注意,在此处,如果您不想向数据库添加指向未由您的迁移控制的表的“真正”的外键,则您的迁移上下文可能缺少导航属性,仅包含相应的外键属性。

我理解的是我必须创建一个DbContext,仅对应应用迁移,并且不应用于查询数据库。我是正确的吗? - Haidar Zeineddine
使用数据库外键引用他人的表将防止DELETE和TRUNCATE TABLE,因此您可能会决定这样做过于侵入性。 - David Browne - Microsoft
模型构建器中的 ignore<> 方法是什么? - Yazid
ModelBuilder.Ignore会完全从模型中移除实体。只需将其从迁移中排除即可。 - David Browne - Microsoft

7

如果在调用Add-Migration操作后检查命令行参数,您可以忽略该实体。

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;
    }
}

1
谢谢。我已经尝试了相当长一段时间来解决这个问题,而这个解决方案简单而有效。 - Benjamin Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接