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

我在使用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; } } 

不支持与显式FK属性(如您的PayGroup.SupervisorIdone-to-one关系。

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

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

并使用以下流畅的映射:

 modelBuilder.Entity() .HasRequired(e => e.Supervisor) .WithOptional() .Map(m => m.MapKey("SupervisorId")); 

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; } // <= } 

将其更改为WithOptional(e => e.PayGroup)

如果你想使它成为必需(表中Allow Nulls = false ),那么使用相应的WithRequiredDependent重载(这里的Dependent意味着Employee将是主体PayGroup将是依赖的 )。