EF 6.1 Code First中不同主键的一对一关系

Bri*_*art 3 c# sql-server entity-framework entity-framework-6 ef-fluent-api

我在使用Entity Framework 6.1从PayGroup对象获取对employee对象的引用时遇到问题.我在PayGroup.SupervisorId - > Employee.EmployeeId上的数据库中有一个外键.请注意,这是一个零或一对一的关系(薪酬组只能有一个主管,一个员工只能是一个薪酬组的主管).

根据GitHub上的这篇文章,在具有不同主键的表上不可能有外键.我手动将外键添加到数据库但我无法弄清楚如何设置流畅的api映射以便能够从薪酬组获取员工对象.

薪酬组表

薪酬组表

员工表

员工表

注意:PayGroup.SupervisorId中有一个外键 - 数据库中的Employee.EmployeeId.

下面是DTO(我目前在这些类之间没有任何工作关系映射):

public class PayGroup
{
    public int Id { get; set; }
    public string SupervisorId { get; set; }
    public virtual Employee Supervisor { get; set; }
}

public class Employee
{
    public string EmployeeId { get; set; }
    public string FullName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 8

one-to-onePayGroup.SupervisorId不支持与显式FK属性(如您的)的关系.

所以从模型中删除该属性:

public class PayGroup
{
    public int Id { get; set; }
    public virtual Employee Supervisor { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并使用以下流畅的映射:

modelBuilder.Entity<PayGroup>()
    .HasRequired(e => e.Supervisor)
    .WithOptional()
    .Map(m => m.MapKey("SupervisorId"));
Run Code Online (Sandbox Code Playgroud)

WithOptional()调用指定了两件事.首先,Employee类中没有反向导航属性,其次是FK是可选的(Allow Nulls = true在表中).

如果您决定添加反向导航属性

public class Employee
{
    public string EmployeeId { get; set; }
    public string FullName { get; set; }
    public virtual PayGroup PayGroup { get; set; } // <=
}
Run Code Online (Sandbox Code Playgroud)

改为WithOptional(e => e.PayGroup).

如果你想要它(Allow Nulls = false在表中),那么使用相应的WithRequiredDependent重载(这里的Dependent意味着Employee将是主体并且PayGroup将是依赖的).