在采用代码优先方法的EF Core中,默认情况下,引用另一个实体的列具有Id
后缀,例如PersonId
。
有可能吗?如果有,怎么做将其更改为_id
,那么更改为person_id
?
在您想要的名称下显式创建外键-在您的情况下是Parent_Id
。保留navigation property
和foreign key
属性。
public int Parent_ID { get; set; }
public virtual Parent Parent { get; set; }
使用.HasForeignKey()
映射外键关系。类似于
builder.HasOne(d => d.Prop)
.WithMany(p => p.NavigationProp)
.HasForeignKey(d => d.ForeignKeyProp)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_ConstraintName");
如果你喜欢data annotation
,你也可以使用
[Column("Parent_ID")]
public int ParentID { get; set; }
要添加到WisdomSeeker的答案中,可以使用[ForeignKey]
注释指向FK.的阴影属性
给定一个类似课程的课程,并为教师提供个人参考:
public class Course
{
[Key]
public int Id {get; set;}
// other fields.
[ForeignKey("person_id")]
public virtual Person Teacher { get; set; }
}
上述备选方案为:
[ForeignKey("Teacher")]
public int person_id { get; set; } // Not recommended naming convention in code.
public virtual Person Teacher { get; set; }
或
[Column("person_id"), ForeignKey("Teacher")]
public int TeacherId { get; set; }
public virtual Person Teacher { get; set; }
我通常避免在类中添加FK字段,因为这会导致老师分配给课程的两个真相来源。你有课程。教师ID和课程。Teacher.Id,在SaveChanges
之前和之后更新时可能有所不同。阴影属性有助于避免混淆并保持数据更新的一致性。
在Db-First实现中,使用[Column]
是很常见的,在这种实现中,您希望对要在代码中使用的属性使用C#命名约定,但要遵守数据库中现有/所需的Db命名约定。我通常不建议在C#类中使用DB命名约定。