我在使用Entity Framework 6.1从PayGroup对象获取对employee对象的引用时遇到问题。我在PayGroup.SupervisorId的数据库中有一个外键 - > Employee.EmployeeId。请注意,这是一个零或一对一的关系(薪资组只能有一个主管,一个员工只能是一个薪酬组的主管)。
根据this post on 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; }
}
答案 0 :(得分:5)
one-to-one
与显式FK属性的关系(例如您的PayGroup.SupervisorId
)。
所以从模型中删除该属性:
public class PayGroup
{
public int Id { get; set; }
public virtual Employee Supervisor { get; set; }
}
并使用以下流畅的映射:
modelBuilder.Entity<PayGroup>()
.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
将是依赖)。