您正在寻找的是多对一的两个实例。外键位于雇员表上。
例如:(表格)
EmpId
Name
BirthCityId
LivingCityId
您可以声明 FK 属性并通过属性或配置将它们连接起来,或者通过影子属性配置它们(推荐)
与属性联系起来:
[Table("Employees")]
public class Employee
{
[Key]
public int EmpId { get; set; }
public string Name { get; set; }
public int BirthCityId { get; set; }
public int LivingCityId { get; set; }
[ForeignKey("BirthCityId")]
public virtual City BirthCity{ get; set; }
[ForeignKey("LivingCityId")]
public virtual City LivingCity{ get; set; }
}
通过配置使用阴影属性(modelBuilder {below} 或 EntityTypeConfiguration)
EF 核心:
[Table("Employees")]
public class Employee
{
[Key]
public int EmpId { get; set; }
public string Name { get; set; }
// No FK declarations.
public virtual City BirthCity{ get; set; }
public virtual City LivingCity{ get; set; }
}
modelBuilder.Entity<Employee>(e =>
{
e.HasKey(x => x.EmpId);
e.Property(x => x.EmpId).HasDatabaseGenerated(DatabaseGenerated.Identity); // For DB managed identity column..
e.HasOne(x => x.BirthCity)
.WithMany()
.HasForeignKey("BirthCityId");
e.HasOne(x => x.LivingCity)
.WithMany()
.HasForeignKey("LivingCityId");
});
EF6 也可以通过.Map(x => x.MapKey() 管理影子属性
当涉及到代码优先时:如果您在未连接 FK 的情况下声明您的实体,EF 将根据导航属性类型为两个城市分配一个影子属性。该表很可能以分别对应 BirthCity 和 LivingCity 的 City_Id 和 City1_Id 结束。 (EF 约定使用“类型”而不是属性名)
我建议对 FK 使用影子属性,以避免实体内的关系存在两个真实来源的情况。 (某些代码可能依赖于employee.BirthCityId,而其他代码使用employee.BirthCity.CityId。更改FK 属性值可能会对实体产生不同的影响,具体取决于相关实体是否已预先加载,因此通常最好只使用导航属性并“隐藏” FK。