Используя Entity Framework 4.1, как мне настроить отношение один ко многим с помощью составных ключей, используя разные имена полей? - PullRequest
1 голос
/ 05 марта 2012

У меня есть две таблицы: DeptMaster и LaborMaster, где один DeptMaster имеет много LaborMasters. Это устаревшие таблицы из старой базы данных, поэтому они не следуют соглашениям об именах Code First. Они оба используют составные ключи, но с разными именами столбцов в каждой таблице. У классов также есть навигационные свойства. Я бы предпочел сопоставлять их с атрибутами, но, пожалуйста, покажите мне этот метод, если это возможно, но также и беглый путь.

[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, но не ясно, как я заставлю Entity Framework знать, как LCompanyNum, LDivisionNum и LDeptNum дочернего элемента указывают на DCompanyNum, DDivisionNum и DDeptNum родительского элемента, когда поля не совпадают по имени. Опять же, я бы предпочел использовать атрибуты, но я не уверен, возможно ли это. Я открыт для любого. Спасибо.

1 Ответ

4 голосов
/ 06 марта 2012

Вам просто нужно добавить атрибут [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 });
...