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