使用实体框架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。同样,我更喜欢使用属性,但我不确定这是否可行。我对任何一种都持开放态度。非常感谢。
您只需要为前三个属性添加[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 });