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'。
有关模型关系/修复问题的任何帮助
答案 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。