如何使用Fluent API在两个表之间配置不同多重性的导航属性

问题描述 投票:0回答:1

我是Entity Framework的新手,我正在尝试在Code-First项目中配置两个导航属性。

第一个属性是employee_pay_period(s)的集合。每个employee_salary都有多个employee_pay_period(s),每个employee_pay_period都有一个employee_salary。

employee_pay_period.employee_salary_id是外键。

第二个属性employee_salary.employee_current_pay_period有点棘手。它是指向当前employee_pay_period的属性。所以导航属性从一个employee_salary到一个employee_pay_period。与第二个属性关联的DB中没有外键,每个employee_salary必须包含employee_current_pay_period。

如何使用流畅的API正确映射这些属性。

public class employee_salary
{
    public employee_salary()
    {
        employee_pay_period = new HashSet<employee_pay_period>();
    }

    [Key]
    public int employee_salary_id { get; set; }

    public int? employee_current_pay_period_id { get; set; }

    public virtual employee_pay_period employee_current_pay_period { get; set; }

    public virtual ICollection<employee_pay_period> employee_pay_period { get; set; }

}



public partial class employee_pay_period
{

    [Key]
    public int employee_pay_period_id { get; set; }

    public int employee_salary_id { get; set; }

    public virtual employee_salary employee_salary { get; set; }
}
c# .net entity-framework ef-fluent-api
1个回答
0
投票

如果我理解正确你想要employee_salaryemployee_pay_period之间的1-many关系,而且employee_salary和当前的employee_pay_period之间的1-1关系

所以这样的事情(假设你已经设置了其余的fluentApi上下文配置类)在OnModelCreating(ModelBuilder builder)函数中:

builder.Entity<employee_salary>(e =>
{
    e.HasMany(s => s.employee_pay_period) // salary has many pay periods
        .WithOne(p => p.employee_salary) // pay period has one salary
        .HasForeignKey(p => p.employee_salary_id) // foreign key on pay period linking to a single salary id
        .OnDelete(DeleteBehavior.Restrict); // Or whatever the desired delete behaviour should be

    e.HasOne(s => s.employee_current_pay_period) // salary has one current pay period
        .WithOne(p => p.employee_salary) // pay period has one salary
        .HasForeignKey<employee_salary>(s => s.employee_current_pay_period_id) // foreign key on salary linking to a single current pay period id
        .OnDelete(DeleteBehavior.Restrict); // Or whatever the desired delete behaviour should be
}
© www.soinside.com 2019 - 2024. All rights reserved.