19

我最近遇到了 Entity Framework Code First 这个奇怪的问题。

我的课看起来像这样

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

无论出于何种原因,创建的数据库表具有以下列

StatusID
Name
MemberID
PosterID
Member_MemberID

, MemberID,PosterIDMember_MemberID是外键。

我怎样才能Member_MemberID不被生成?

4

2 回答 2

15

您的Member_MemberID列是由于该Member.Statuses属性而创建的。我可以想象这不是你想要的。可能成员和状态应该彼此独立存在,因此您需要一个联结表。

我不知道您是否已经使用了OnModelCreatingDbContext 的覆盖,但这是更改 Member 和 Status 之间映射的地方:

protected override void OnModelCreating(DbModelBuilder mb)
{
    mb.Entity<Member>().HasMany(m => m.Statuses).WithMany();
}

这将创建一个表 MemberStatuses 表,其中两个 Id 列作为外键。这是一种在关联的“另一端”没有导航属性的情况下对多对多关系进行建模的方法。(我不认为你想要一个Members属性Status)。

于 2012-06-06T10:09:16.100 回答
10

我以前见过这个。就我而言(使用 EF 6.1),这是因为我的 Fluent API 映射设置如下:

// In my EntityTypeConfiguration<Status>
HasRequired(x => x.Member).WithMany().HasForeignKey(x => x.MemberID);

该代码运行良好,但它并没有告诉 EF 我Member的班级的集合导航属性Status已被考虑在内。因此,虽然我在我的类中明确处理了Member导航属性的存在Status,但我现在留下了一个孤立的相关集合属性。那个孤立的属性,作为一个集合,告诉 EF 我的Status类需要有一个外键。所以它在Status类上创建了它。

要解决它,我必须 100% 明确。

HasRequired(x => x.Member).WithMany(x => x.Statuses).HasForeignKey(x => x.MemberID)

可能是您的StatusesCollection 属性Member需要一个属性来告诉它它已经被考虑过,而不是去自动创建映射。我不知道那个属性。

于 2018-01-21T23:39:09.107 回答