Почему я получаю дополнительный столбец внешнего ключа с атрибутами первого внешнего ключа 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
от сгенерированного?
Ответы
Ответ 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
нужен атрибут, говорящий, что он уже рассмотрен, а не для автоматического создания сопоставлений. Я не знаю этого атрибута.