C# 使用FluentApi为已经存在的表创建外键

C# 使用FluentApi为已经存在的表创建外键,c#,.net-core,entity-framework-core,ef-fluent-api,C#,.net Core,Entity Framework Core,Ef Fluent Api,在我的项目中,出于某种原因,我有两个独立的存储库(使用不同的DbContext和schema)。现在,我需要从DbContextB中的一个模型类到DbContextA中的另一个模型类创建一个外键,假设DbContextA已经应用于数据库 //This is a code snippet in DbContextB.IEntityTypeConfiguration<ModelClassB>() method. builder .HasOne(col => col.Pro

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

//This is a code snippet in DbContextB.IEntityTypeConfiguration<ModelClassB>() method. 
builder
    .HasOne(col => col.PropertyA)
    .WithOne()
    .HasForeignKey<ModelClassB>(col => col.PropertyAId)
    .IsRequired();
//这是DbContextB.IEntityTypeConfiguration()方法中的代码段。
建设者
.HasOne(col=>col.PropertyA)
.WithOne()
.HasForeignKey(col=>col.PropertyAId)
.IsRequired();
问题是,
DbContextB
将自动为
ModelClassA
创建一个表,而该表已经存在,因为我首先运行了
DbContextA
迁移脚本。
但是,实现这一点的一种方法是将外键手动插入生成的迁移脚本中(
ModelClassB.PropertyAId
对我来说就足够了,我不关心它的导航属性
ModelClassB.PropertyA
)。
问题是:如何强制
DbContextB
添加外键而不需要添加其对应的表?

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

从GitHub:

我刚找到一个解决办法

  • 创建另一个继承您的
    DbContext
    DbContext
    ,例如
    MigrationDbContext
    。重写
    OnModelCreating
    方法,并删除您希望不生成该表的实体
  • 模型创建时受保护的覆盖无效(ModelBuilder)
    {
    基于模型创建(生成器);
    builder.Ignore();
    }
    
  • 创建另一个实现
    IDbContextFactory
    的类。比如说
  • 公共类迁移ContextFactory:IDbContextFactory
    {
    public MigrationDbContext Create()
    {
    var optionsBuilder=new DbContextOptionsBuilder();
    optionsBuilder.UseSqlite(“数据源=blog.db”);
    返回新的MigrationDbContext(optionsBuilder.Options);
    }
    }
    
    迁移工具将发现此
    MigrationContextFactory
    ,并使用
    MigrationDbContext


    对于EF Core>=5.0,版本
    5.0.0-rc1
    引入了全新的
    Relational:IsTableExcludeFromMigrations
    注释,您可以通过使用新的
    实体.ToTable(字符串名称,bool ExcludeFromMigrations)来设置该注释
    Fluent API扩展方法重载。

    我做了一些小改动:1-因为我们继承了前面的
    DbContext
    ,所以应该省略
    builder.Ignore()因为我们需要生成
    Category
    表。2-我手动更改了
    DbContextA