我该如何解决这个问题: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;}
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;}