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

时间:2016-12-05 12:08:45

标签: entity-framework entity-relationship ef-migrations

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;}


    }

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

我想要的关系是: 一个团队有一个TeamLeader(用户) 团队中有许多用户可以加入该团队

这是我在User对象中的这些关系

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

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

然而,在运行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:无效的列名称'TeamID'。

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

2 个答案:

答案 0 :(得分:1)

您的评论中,您无法确定关系。使用注释执行此操作的一种方法是使用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;}

答案 1 :(得分:0)

此处持久属性 ForeignKey 用法不正确。您正在将它应用于原始值本身。 正确的用法是将其应用于导航属性,以指示哪个原始属性存储其FK值。

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

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

当EF找到Team导航属性时,它将尝试在PLUser中找到一个名为TeamID或TeamId的原始属性,其类型与Team类PK相同,以将其用作ForeignKey。