Entity framework 核心上下文中 Fk 的命名
Naming of Fk in Entity framework core context
我正在处理一个 EF 核心 2.2 rest api 项目。
我使用 dbfirst 方法和 "Scaffold-DbContext" 命令创建了我的模型和上下文。
模型和上下文有效,但我注意到在上下文代码中有明确的外键名称:
modelBuilder.Entity<TrackingPoints>(entity =>
{
entity.HasKey(e => e.IdPosition);
entity.ToTable("myTable");
entity.Property(e => e.CaseId).HasColumnName("CaseId");
entity.HasOne(d => d.IGeoPosition)
.WithMany(p => p.TrackingPoints)
.HasForeignKey(d => d.IPositionId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK__Track__iGeoP__278EDA44");
});
(实际的table有更多字段,但我保持简短)
我担心的是 FK 名称 (HasConstraintName)。
实际上这段代码有关于 table 之间数据关系的信息,但它也有 FK 约束的明确名称。
我注意到在此数据库的不同实例(开发、预生产...)中,相同的约束具有不同的名称。
我想知道我是否必须在数据库的所有实例上为 FK 约束赋予相同的名称,或者尽管约束的命名不匹配,映射是否仍能正常工作。在开发环境中它可以工作,并且 FK 名称与模型中的名称相匹配。在不同的环境中,第一次测试是可以的,但我不知道命名问题是否会产生一些晦涩难懂的副作用。
Constraint/index 名称是物理关系数据库映射的一部分,并且 仅 对于代码优先迁移很重要,以防迁移需要删除约束。如果名称不匹配,它将无法删除它并且整个迁移可能会失败。
如果您继续使用数据库优先方法并重新搭建(或使用某些外部工具更新)数据库更改时的上下文,constraint/index 名称将不会对 EF Core 行为产生任何影响。
如果您在未来某个时候决定切换到代码优先迁移,就会出现此问题。因此,尽管对于您当前的工作流程来说不是非常必要,但在所有数据库中保持名称相同会更安全。
我正在处理一个 EF 核心 2.2 rest api 项目。 我使用 dbfirst 方法和 "Scaffold-DbContext" 命令创建了我的模型和上下文。
模型和上下文有效,但我注意到在上下文代码中有明确的外键名称:
modelBuilder.Entity<TrackingPoints>(entity =>
{
entity.HasKey(e => e.IdPosition);
entity.ToTable("myTable");
entity.Property(e => e.CaseId).HasColumnName("CaseId");
entity.HasOne(d => d.IGeoPosition)
.WithMany(p => p.TrackingPoints)
.HasForeignKey(d => d.IPositionId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK__Track__iGeoP__278EDA44");
});
(实际的table有更多字段,但我保持简短)
我担心的是 FK 名称 (HasConstraintName)。 实际上这段代码有关于 table 之间数据关系的信息,但它也有 FK 约束的明确名称。
我注意到在此数据库的不同实例(开发、预生产...)中,相同的约束具有不同的名称。
我想知道我是否必须在数据库的所有实例上为 FK 约束赋予相同的名称,或者尽管约束的命名不匹配,映射是否仍能正常工作。在开发环境中它可以工作,并且 FK 名称与模型中的名称相匹配。在不同的环境中,第一次测试是可以的,但我不知道命名问题是否会产生一些晦涩难懂的副作用。
Constraint/index 名称是物理关系数据库映射的一部分,并且 仅 对于代码优先迁移很重要,以防迁移需要删除约束。如果名称不匹配,它将无法删除它并且整个迁移可能会失败。
如果您继续使用数据库优先方法并重新搭建(或使用某些外部工具更新)数据库更改时的上下文,constraint/index 名称将不会对 EF Core 行为产生任何影响。
如果您在未来某个时候决定切换到代码优先迁移,就会出现此问题。因此,尽管对于您当前的工作流程来说不是非常必要,但在所有数据库中保持名称相同会更安全。