使用实体框架4.1,我如何使用不同的字段名称配置具有复合键的一对多关系

本文关键字:配置 字段 关系 一对多 复合 框架 实体 何使用 | 更新日期: 2023-09-27 18:26:53

我有两个表:DeptMaster和LaborMaster,其中一个DeptMasteer有许多LaborMaster。这些是来自旧数据库的遗留表,因此它们不遵循代码优先命名约定。它们都使用复合键,但每个表中的列名不同。这些类也具有导航属性。我更喜欢用属性映射它们,但如果可能的话,请向我展示这种方法,但也要流畅。

[Table("DeptMaster"), Schema="HR"]
public partial class DeptMaster
{
    public DeptMaster()
    {
         this.LaborMasters = new HashSet<LaborMaster>();
    }
    [Key, Column(Order = 0)]
    public decimal DCompanyNum {get;set;}
    [Key, Column(Order = 1)]
    public decimal DDivisionNum {get;set;}
    [Key, Column(Order = 2)]
    public decimal DDeptNum {get;set;}
    public string  DDeptName {get;set;}
    public virtual ICollection<LaborMaster> LaborMasters { get; set; }
}
[Table("LaborMaster"), Schema="HR"]
public partial class LaborMaster
{        
    [Key, Column(Order = 0)]
    public decimal LCompanyNum {get;set;}
    [Key, Column(Order = 1)]
    public decimal LDivisionNum {get;set;}
    [Key, Column(Order = 2)]
    public decimal LDeptNum {get;set;}
    [Key, Column(Order = 3)]
    public decimal LEmployeeNum {get; set;}
    public string  LLaborName {get;set;}
    public virtual DeptMaster DeptMaster{ get; set; }
}

在我的OnModelCreating中,我尝试使用HasMany,但尚不清楚如何使实体框架知道当字段名称不匹配时,子级的LCompanyNum、LDivisionNum和LDeptNum如何指向父级的DCompanyNumber、DDivisionNumber和DDeptNum。同样,我更喜欢使用属性,但我不确定这是否可行。我对任何一种都持开放态度。非常感谢。

使用实体框架4.1,我如何使用不同的字段名称配置具有复合键的一对多关系

您只需要为前三个属性添加[ForeignKey]属性:

[Table("LaborMaster"), Schema="HR"]
public partial class LaborMaster
{        
    [Key, ForeignKey("DeptMaster"), Column(Order = 0)]
    public decimal LCompanyNum {get;set;}
    [Key, ForeignKey("DeptMaster"), Column(Order = 1)]
    public decimal LDivisionNum {get;set;}
    [Key, ForeignKey("DeptMaster"), Column(Order = 2)]
    public decimal LDeptNum {get;set;}
    [Key, Column(Order = 3)]
    public decimal LEmployeeNum {get; set;}
    public string  LLaborName {get;set;}
    public virtual DeptMaster DeptMaster{ get; set; }
}

或者将[ForeignKey]属性放在导航属性上:

    [ForeignKey("LCompanyNum, LDivisionNum, LDeptNum")]
    public virtual DeptMaster DeptMaster{ get; set; }

在这里,属性名称的顺序很重要,它必须遵循列顺序。

使用Fluent API:

modelBuilder.Entity<DeptMaster>()
    .HasKey(d => new { d.DCompanyNum, d.DDivisionNum, d.DDeptNum })
    .HasMany(d => d.LaborMasters)
    .WithRequired(l => l.DeptMaster)
    .HasForeignKey(l => new { l.LCompanyNum, l.LDivisionNum, l.LDeptNum });