EF 6.1 Code First 中与不同主键的一对一关系
One to One Relationship with Different Primary Key in EF 6.1 Code First
我在使用 Entity Framework 6.1 从 PayGroup 对象获取对员工对象的引用时遇到问题。我在 PayGroup.SupervisorId -> Employee.EmployeeId 的数据库中有一个外键。请注意,这是零或一对一的关系(一个薪酬组只能有一个主管,一个员工只能是一个薪酬组的主管)。
根据 this post on GitHub,在具有不同主键的 table 上不可能有外键。我已经手动将外键添加到数据库中,但我不知道如何设置流畅的 api 映射才能从薪酬组中获取员工对象。
支付组Table
员工Table
注:数据库中有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; }
}
不支持 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
class中没有反向导航属性,其次FK是可选的(table中的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)
。
如果你想让它成为必需的(table中的Allow Nulls = false
),那么使用相应的WithRequiredDependent
重载(Dependent这里意味着 Employee
将是 principal 而 PayGroup
将是 dependent)。
我在使用 Entity Framework 6.1 从 PayGroup 对象获取对员工对象的引用时遇到问题。我在 PayGroup.SupervisorId -> Employee.EmployeeId 的数据库中有一个外键。请注意,这是零或一对一的关系(一个薪酬组只能有一个主管,一个员工只能是一个薪酬组的主管)。
根据 this post on GitHub,在具有不同主键的 table 上不可能有外键。我已经手动将外键添加到数据库中,但我不知道如何设置流畅的 api 映射才能从薪酬组中获取员工对象。
支付组Table
员工Table
注:数据库中有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; }
}
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
class中没有反向导航属性,其次FK是可选的(table中的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)
。
如果你想让它成为必需的(table中的Allow Nulls = false
),那么使用相应的WithRequiredDependent
重载(Dependent这里意味着 Employee
将是 principal 而 PayGroup
将是 dependent)。