Подтвердить что ты не робот

Почему я получаю дополнительный столбец внешнего ключа с атрибутами первого внешнего ключа Entity Framework?

Недавно я столкнулся с этой странной проблемой с 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, PosterID и Member_MemberID являются внешними ключами.

Как я могу сохранить Member_MemberID от сгенерированного?

4b9b3361

Ответ 1

Ваш столбец Member_MemberID создается из-за свойства Member.Statuses. Я могу представить, что это не то, что вы хотите. Вероятно, члены и статусы должны существовать независимо друг от друга, поэтому вам нужна таблица соединений.

Я не знаю, если вы уже используете переопределение OnModelCreating DbContext, но это место для изменения сопоставления между Member и Status:

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

Это создаст таблицу MemberStatuses таблицы с двумя столбцами Id как внешние ключи. Это способ моделирования отношений "многие ко многим" без свойства навигации на "другой" стороне ассоциации. (Я не думаю, что вам нужно свойство Members в Status).

Ответ 2

Я видел это раньше. В моем случае (с использованием EF 6.1) это было связано с тем, что мой API-интерфейс Fluent API был настроен так:

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

Этот код работает отлично, но он не говорит EF о том, что учитывается класс Member class Navigational Property Status ha. Итак, хотя я явно рассматривал существование Member Навигационного свойства в моем классе Status, теперь я оставил свойство связанной с сиротой связанного сбора. Это потерянное свойство, являясь коллекцией, сообщает EF, что у моего класса Status должен быть внешний ключ к нему. Поэтому он создает это в классе Status.

Чтобы исправить это, я должен был быть на 100% явным.

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

Можно предположить, что вашему свойству Statuses Collection в Member нужен атрибут, говорящий, что он уже рассмотрен, а не для автоматического создания сопоставлений. Я не знаю этого атрибута.