一对一关系EF6和主键出现问题

时间:2019-04-14 21:07:27

标签: c# entity-framework-6

我有3张桌子

用户>员工>操作员

彼此之间存在一对一的关系

public class User
{
    [Key]
    public int Id { get; set; }
    public string Username { get; set; } 
    public DateTime? LoginDate { get; set; }
    public bool IsActive{ get; set; }    

    public ICollection<Role> Roles { get; set; }
    public virtual  Employee Employee { get; set; }
}

public class Employee 
{
    [Key]
    [ForeignKey("User")]
    public int Id { get; set; }
    public string Name{ get; set; }
    public string Email { get; set; }

    public int UserId { get;set; }
    public virtual User User { get; set; } 


    public virtual Operator Operator{ get; set; }  
}

public class Operator
{
    [Key]
    [ForeignKey("Employee")]
    public int Id { get; set; }

    public int EmployeeId {get;set;}
    public EmployeeEmployee{ get; set; }
}

但是,当我在Sql Server MS中创建图表以检查关系时,确实会创建一对一关系。

问题是,当我尝试直接从Sql以图形方式直接插入数据时,它希望我在Employee和Operator表上插入主键。为什么他们不像用户那样自动?

1 个答案:

答案 0 :(得分:0)

首先,您不需要指定两个变量来存储相同的信息。

public int UserId { get;set; }
public int EmployeeId {get;set;}

已存储在ID中。不需要重复。

外键不使用身份(不生成值)。因此,您需要先创建User,然后创建Employe,然后在其中设置“ User”属性与之前创建的用户。 (主要思想是您需要手动初始化对外键的引用)

User user = new User{...};
Employee employe = new Employee{User = user, ...};
context.Add(employee);
context.SaveChanges();

或者也许您将使用层次结构。(我没有在3个级别上进行检查,但在2个级别上,这是完美的选择)。

public class User
{
    [Key]
    public int Id { get; set; }
    public string Username { get; set; } 
    public DateTime? LoginDate { get; set; }
    public bool IsActive{ get; set; }    

    public ICollection<Role> Roles { get; set; }
}

public class Employee : User
{
    public string Name{ get; set; }
    public string Email { get; set; }
}

public class Operator : Employee
{

}