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)