使用 Fluent Api 创建已存在 table 的外键

Create a foreign key to already existed table using FluentApi

在我的项目中,出于某种原因,我有两个独立的存储库(具有不同的 DbContextschema)。现在,我需要创建一个从 DbContextB 中的一个模型 class 到 DbContextA 中的另一个模型 class 的外键,假设 DbContextA 已经应用于数据库.

//This is a code snippet in DbContextB.IEntityTypeConfiguration<ModelClassB>() method. 
builder
    .HasOne(col => col.PropertyA)
    .WithOne()
    .HasForeignKey<ModelClassB>(col => col.PropertyAId)
    .IsRequired();

问题是,DbContextB 会自动为 ModelClassA 创建一个 table,而这个 table 已经存在,因为我 运行 DbContextA 先迁移脚本。
但是,实现此目的的一种方法是 手动将外键插入生成的迁移脚本 ModelClassB.PropertyAId 对我来说已经足够了,我不关心它的导航 属性 ModelClassB.PropertyA)。 问题是:如何强制 DbContextB 添加外键而不需要添加其对应的 table?

对于 EF Core < 5.0,此方案的一般方法是仅针对迁移使用特殊上下文,其中包含所有模型 类 和关系。您的应用不会使用此特殊上下文。

迁移到 exclude/skip/ignore 部分模型的能力,以便不创建 table (对于重叠的有界上下文) #2725 GitHub:

I just found a workaround

  1. Create another DbContext that inherit your DbContext, for example MigrationDbContext. Override the OnModelCreating method and ingore entities that you want it's table not being generated.
 protected override void OnModelCreating(ModelBuilder builder)
 {
     base.OnModelCreating(builder);
     builder.Ignore<Category>();
 }
  1. Create another class that implement IDbContextFactory. For example
    public class MigrationContextFactory : IDbContextFactory<MigrationDbContext>
    {
        public MigrationDbContext Create()
        {
            var optionsBuilder = new DbContextOptionsBuilder<MigrationDbContext>();
            optionsBuilder.UseSqlite("Data Source=blog.db");

            return new MigrationDbContext(optionsBuilder.Options);
        }
    }

The migration tool will discover this MigrationContextFactory and use the MigrationDbContext.

对于 EF Core >= 5.0,版本 5.0.0-rc1 引入了全新的 Relational:IsTableExcludedFromMigrations 注释,您可以设置例如通过使用新的 entity.ToTable(string name, bool excludedFromMigrations) Fluent API 扩展方法重载。