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

Posted

技术标签:

【中文标题】实体框架 - 多个字段中的相同外键【英文标题】:Entity Framework - same foreign key in multiple field 【发布时间】:2021-10-05 08:21:32 【问题描述】:

我有 2 张桌子:

城市

cityId
CityName

员工

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

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

【问题讨论】:

请告诉我们你到目前为止做了什么。 我已经尝试了很多我通过谷歌搜索找到的方法,但没有什么是我正在寻找的。​​span> 你现在期待什么?我真的很抱歉,但这不是一个免费的编码网站。我们无法为您创建整个数据库上下文代码。如果您有一些错误,我们只能提供帮助。尝试创造你能做的。创建所有属性等等。只有在此发布您的代码后,我们才会尽力为您提供帮助。 看起来 EF 应该能够按照惯例映射它。再次,展示您尝试过的内容。我们没有什么可去的。两个属性列表,仅此而已。没有课程,没有 EF 版本。没有异常消息。 【参考方案1】:

您正在寻找的是多对一的两个实例。外键位于雇员表上。

例如:(表格)

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 =&gt; x.MapKey() 管理影子属性

当涉及到代码优先时:如果您在未连接 FK 的情况下声明您的实体,EF 将根据导航属性类型为两个城市分配一个影子属性。该表很可能以分别对应 BirthCity 和 LivingCity 的 City_Id 和 City1_Id 结束。 (EF 约定使用“类型”而不是属性名)

我建议对 FK 使用影子属性,以避免实体内的关系存在两个真实来源的情况。 (某些代码可能依赖于employee.BirthCityId,而其他代码使用employee.BirthCity.CityId。更改FK 属性值可能会对实体产生不同的影响,具体取决于相关实体是否已预先加载,因此通常最好只使用导航属性并“隐藏” FK。

【讨论】:

以上是关于实体框架 - 多个字段中的相同外键的主要内容,如果未能解决你的问题,请参考以下文章

构建Android AOSP时遇到“错误:多个字段具有相同的columnName”

实体框架代码优先:关系约束中的从属角色和主体角色中的属性数量必须相同

SQLITE:选择共享相同外键的所有项目

实体框架 - 代码优先:使用相同类型的多个子/可选属性进行映射

实体框架检测到冲突的更改。尝试使用相同的密钥插入多个实体时可能会发生这种情况

公共字段自动填充