EF6 CodeFirst ForeignKey属性映射无法按预期工作

时间:2016-02-09 08:30:12

标签: c# entity-framework sqlite ef-code-first

我有一个多对一的情况,员工可以为许多客户服务,每个客户由1名员工提供服务。在Customer类中,我使用ForeignKey属性将SupportRep映射到EmployeeId,它给了我一个错误。

public class Customer
{
    [Key]
    public int CustomerId { get; set; }
    ...

    public int? SupportRepId { get; set; }

    [ForeignKey("EmployeeId")]
    public virtual Employee SupportRep { get; set; }
}

public class Employee
{
    [Key]
    public int EmployeeId { get; set; }
    ...

    [ForeignKey("SupportRepId")]
    public virtual ICollection<Customer> Customers { get; set; }
}

我得到的错误是:

  

错误:属性&#39; SupportRep&#39;上的ForeignKeyAttribute在类型&#39; SqlLiteChinook。   客户&#39;无效。外键名称&#39; EmployeeId&#39;在d上没有找到   依赖类型&#39; SqlLiteChinook.Customer&#39;。 Name值应为逗号分隔符   外国关键财产名称列表。

但是,如果我在Customer类中将EmployeeId更改为SupportRepId,则可以正常工作。

Customer类中的外键是否指向Employee类的EmployeeId?

请赐教。谢谢。

2 个答案:

答案 0 :(得分:1)

你把事情搞混了。 [ForeignKey("EmployeeId")]类中的Customer必须说明该类的哪个属性是Employee的外键。该属性不会在Employee类中查找外键。

你的第二个错误是在ICollection<Customer>上声明一个外键。由于您拥有一对多关系,因此您的收藏集不能指向一个客户,它与多个客户有关系。因此,您的客户需要向员工提供外键(每个客户都要指向一名员工),但员工不能包含客户的外键。

public class Customer
{
  [Key]
  public int CustomerId { get; set; }
  ...
  public int? SupportRepId { get; set; }

  [ForeignKey("SupportRepId")]
  public virtual Employee SupportRep { get; set; }
}

public class Employee
{
  [Key]
  public int EmployeeId { get; set; }
  ...
  public virtual ICollection<Customer> Customers { get; set; }
}

答案 1 :(得分:0)

试试这个

public class Customer
{
    [Key]
    public int CustomerId { get; set; }
    ...

    public int? SupportRepId { get; set; }

    [ForeignKey("SupportRepId")]
    public virtual Employee SupportRep { get; set; }
}

public class Employee
{
    [Key]
    public int EmployeeId { get; set; }
    ...

    public virtual ICollection<Customer> Customers { get; set; }
}