EF代码首先是一对多关系

时间:2014-01-04 16:19:29

标签: c# entity-framework ef-code-first foreign-keys data-annotations

我有以下实体:

public class User
{
    [Key, MaxLength(8)]
    public string Id                     { get; set; }
    [Required]
    public short DepartmentId            { get; set; }

    public virtual Department Department { get; set; }
}


public class Department
{
    [Key]
    public short Id                      { get; set; }
    [Required]
    public string Name                   { get; set; }
    public string ManagerUserId          { get; set; }

    public virtual User Manager          { get; set; }
}

我无法管理如何添加下图中显示的关系:

enter image description here

我的主要问题是添加ManagerUserIdUser实体之间的关系。做了一些研究后,我尝试了以下几点:

[ForeignKey("ManagerUserId")]
public virtual User Manager          { get; set; }

但它一直给我以下错误:

  

无法确定类型'CheckFlights.User'和'CheckFlights.Department'之间关联的主要结束。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。

问:我如何让它拥有上图中的关系? Manager实体中的Department属性可以是用户还是null?用户可以同时成为少数部门的经理。

1 个答案:

答案 0 :(得分:1)

EF尝试按照两种类型之间的约定建立单个一对一关系,因为两个导航属性都是引用(而不是集合)。但实际上你想要两个一对多的关系。您必须使用Fluent API覆盖默认约定才能实现此目的:

modelBuilder.Entity<User>()
    .HasRequired(u => u.Department)
    .WithMany()
    .HasForeignKey(u => u.DepartmentId);

modelBuilder.Entity<Department>()
    .HasOptional(d => d.Manager)
    .WithMany()
    .HasForeignKey(d => d.ManagerUserId);