2

我遇到了使用实体框架6.1从PayGroup对象中获取对员工对象的引用的问题。我在PayGroup.SupervisorId - > Employee.EmployeeId数据库中有一个外键。请注意,这是零或一对一的关系(薪酬组只能有一个主管,一个员工只能是一个薪酬组的主管)。EF 6.1中不同主键的一对一关系代码优先

根据this post on GitHub,不可能在具有不同主键的表上具有外键。我已经手动添加了外键到数据库,但我无法弄清楚如何设置流利的api映射,以便能够从薪酬组中获得员工对象。

收费组表

Pay Group Table

EMPLOYEE表

Employee 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; } 
} 
+0

您尝试类似[this](http://www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx)? –

回答

4

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过载(相关这里指Employee将是主要PayGroup将是依赖)。

+0

很简单,当它被清楚地解释。我想我正在被WithOptional和HasRequired搞砸了。我也尽我所能不要从PayGroup中删除SupervisorId字段。谢谢! –