微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实体框架 - 多个字段中的相同外键

如何解决实体框架 - 多个字段中的相同外键

我有 2 张桌子:

城市

cityId
CityName

员工

EmpId
Name
BirthCity - foreign key - cityid
LivingCity - foreign key - cityid

如何使用实体框架和代码优先方法Employee 表中两次使用相同的 CityId 作为外键?

解决方法

您要查找的是多对一的两个实例。外键位于员工表上。

例如:(表格)

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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。