我该如何解决这个问题:System.Data.SqlClient.SqlException:列名称无效 'TeamID'

How do i fix this : System.Data.SqlClient.SqlException: Invalid column name 'TeamID'

public class Team
    {
        public Team()
        {
            TeamSchemes = new HashSet<Scheme>();
            TeamUsers = new HashSet<PLUser>();
        }

        public int ID { get; set; }
        public string Name { get; set; }

        [ForeignKey("Office")]
        public int OfficeID { get; set;}
        public virtual Office Office { get; set; }

        [ForeignKey("TeamLeader")]
        public int TeamLeaderID { get; set; }


        public virtual PLUser TeamLeader { get; set; }
        public virtual ICollection<Scheme> TeamSchemes { get; set; }
        public virtual ICollection<PLUser> TeamUsers {get;set;}


    }

我有一个团队对象和一个用户对象。

我想要的关系是: 一个团队有一个团队负责人(用户) 一个团队有很多用户可以在该团队中

这是我的用户对象中这些关系的内容

        [ForeignKey("Team")]
        public int? TeamID { get; set; }
        public virtual Team Team { get; set; }

        public virtual ICollection<Team> TeamsLeading { get; set; }

然而,当 运行ning codeFirst 迁移时,我从某处

获得了一个名为 Team_ID 的额外列

我在模型构建器中明确说明了我的关系,如下所示:

    modelBuilder.Entity<Team>().HasRequired(x => x.TeamLeader).WithMany(u=>u.TeamsLeading).HasForeignKey(t=>t.TeamLeaderID);

modelBuilder.Entity<PLUser>().HasOptional(x => x.Team).WithMany(t=>t.TeamUsers).HasForeignKey(x => x.TeamID);

modelBuilder.Entity<PLUser>().HasMany(u => u.TeamsLeading).WithRequired(t => t.TeamLeader);

迁移代码 运行 成功并且似乎显示了预期的结果。然而,当我 运行 应用程序时,我收到以下错误并且应用程序不会 运行:

System.Data.SqlClient.SqlException: Invalid column name 'TeamID'.

关于模型关系/修复问题的任何帮助

永久属性 ForeignKey 用法在这里是错误的。您正在将其应用于原始值本身。 正确的用法是将它应用于导航属性,以指示什么原语 属性 存储其 FK 值。

在你的情况下,它不是必需的,因为 EF 会按照惯例解决它:

public class PLUser{        
    public int? TeamID { get; set; }
    public virtual Team Team { get; set; }
}

当EF找到团队导航属性时,它会尝试在PLUser中找到一个名为TeamID或TeamId的原语属性,与团队class PK的类型相同,以将其用作外键。

您关于 EF 无法确定关系的评论是正确的。使用注释的一种方法是使用 InverseProperty。尝试:

[InverseProperty("Team")]
public virtual ICollection<PLUser> TeamUsers {get;set;}

[InverseProperty("TeamLeader")]
public virtual ICollection<Team> TeamsLeading { get; set; }

编辑:您可能需要尝试一下(自从我这样做以来已经有一段时间了),但您可能想要这样做:

[InverseProperty("TeamsLeading")]
public virtual PLUser TeamLeader { get; set; }
public virtual ICollection<Scheme> TeamSchemes { get; set; }
[InverseProperty("Team")]
public virtual ICollection<PLUser> TeamUsers {get;set;}