使用 Fluent Api 创建已存在 table 的外键
Create a foreign key to already existed table using FluentApi
在我的项目中,出于某种原因,我有两个独立的存储库(具有不同的 DbContext
和 schema
)。现在,我需要创建一个从 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
- 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>();
}
- 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 扩展方法重载。
在我的项目中,出于某种原因,我有两个独立的存储库(具有不同的 DbContext
和 schema
)。现在,我需要创建一个从 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
- Create another
DbContext
that inherit yourDbContext
, for exampleMigrationDbContext
. Override theOnModelCreating
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>(); }
- Create another class that implement
IDbContextFactory
. For examplepublic 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 theMigrationDbContext
.
对于 EF Core >= 5.0,版本 5.0.0-rc1
引入了全新的 Relational:IsTableExcludedFromMigrations
注释,您可以设置例如通过使用新的 entity.ToTable(string name, bool excludedFromMigrations)
Fluent API 扩展方法重载。