Entity framework 为什么我会得到一个额外的外键列,其中包含实体框架代码优先外键属性?
我最近首先遇到了实体框架代码的这个奇怪问题 我的班级看起来像这样Entity framework 为什么我会得到一个额外的外键列,其中包含实体框架代码优先外键属性?,entity-framework,ef-code-first,Entity Framework,Ef Code First,我最近首先遇到了实体框架代码的这个奇怪问题 我的班级看起来像这样 public class Status { [Key] public int StatusID { get; set; } public string Name { get; set; } public int MemberID { get; set; } [ForeignKey("MemberID")] public vi
public class Status
{
[Key]
public int StatusID { get; set; }
public string Name { get; set; }
public int MemberID { get; set; }
[ForeignKey("MemberID")]
public virtual Member Member { get; set; }
public int PosterID { get; set; }
[ForeignKey("PosterID")]
public virtual Member Poster { get; set; }
public virtual ICollection<StatusLike> StatusLikes { get; set; }
public virtual ICollection<StatusComment> StatusComments { get; set; }
}
public class Member
{
[Key]
public int MemberID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Bio { get; set; }
public virtual ICollection<MemberCourseTaken> MemberCourseTakens { get; set; }
public virtual ICollection<Status> Statuses { get; set; }
public virtual ICollection<Club> FoundedClubs { get; set; }
public string EmailAddress { get; set; }
public string Password { get; set; }
public string Phone { get; set; }
public int AccountSourceID { get; set; }
public AccountSource AccountSource { get; set; }
public int AddressID { get; set; }
public Address Address { get; set; }
public string ProfilePhoto { get; set; }
public int MemberRankID { get; set; }
public MemberRank MemberRank { get; set; }
public DateTime Created { get; set; }
public DateTime Modified { get; set; }
}
将MemberID
、PosterID
和MemberID
作为外键
如何防止生成
Member\u MemberID
?您的Member\u MemberID
列是由于Member.Statuses
属性而创建的。我可以想象这不是你想要的。可能成员和状态应该彼此独立存在,因此您需要一个连接表
我不知道您是否已经使用了DbContext的OnModelCreating
重写,但这是更改成员和状态之间映射的地方:
protected override void OnModelCreating(DbModelBuilder mb)
{
mb.Entity<Member>().HasMany(m => m.Statuses).WithMany();
}
模型创建时受保护的覆盖无效(DbModelBuilder mb)
{
mb.Entity().HasMany(m=>m.status);
}
这将创建一个带有两个Id列作为外键的表MemberStatus表。这是一种建模多对多关系的方法,在关联的“另一方”没有导航属性。(我认为您不需要
状态中的成员
属性。我以前见过这种情况。在我的例子中(使用EF 6.1),这是因为我的Fluent API映射设置如下:
// In my EntityTypeConfiguration<Status>
HasRequired(x => x.Member).WithMany().HasForeignKey(x => x.MemberID);
可能是成员
中的状态
集合属性需要一个属性,告诉它它已经被考虑,而不是自动创建映射。我不知道该属性。从成员
到状态
的导航属性有多少?展示你的会员
班级。很多!我在问题中加入了成员类。这里再多解释一下就好了。我真的不明白为什么2对多关系会导致创建Member\u MemberID
列。为什么需要它?@Jez你是对的,可以解释得更好一点。Member\u MemberID
字段是一对多关系成员状态的FK to状态。创建它是因为关联不被视为成员
或海报
的双向部分。我的解决方案的要点是(imo)成员和状态是相当独立的实体,不像订单行那样聚合。我真的很难理解你的意思,@GertArnold。什么是“协会”?什么是“双向部分”?“关联”(或关系)是成员状态。通常关联是双向的(订单->订单行&订单行->订单)。在那种情况下,一个FK就足够了。但这里有两个协会状态->会员和一个协会成员->状态。EF不会假设两个状态->成员关联中的哪一个是双向的(或者:与成员->状态具有相同的FK),因此会创建第三个FK。可以告诉EF哪种关联是双向的,但对我来说,保持实体的独立性看起来更好,显然,OP也同意。经过更多的研究,我发现这可以通过反向属性来实现。请看这里了解更多信息:太棒了,这为我修复了它!天哪,谢谢你。几个小时后,我的头撞在墙上,这帮我修好了。再次感谢!
// In my EntityTypeConfiguration<Status>
HasRequired(x => x.Member).WithMany().HasForeignKey(x => x.MemberID);
HasRequired(x => x.Member).WithMany(x => x.Statuses).HasForeignKey(x => x.MemberID)