Если вам не нравятся имена таблиц и столбцов по умолчанию, которые Entity Framework выбирает для вас, вы можете сообщить Entity Framework, какими они должны быть.
Для этого вы можете использовать атрибуты.ИМХО, это делает ваш код ужасным.Кроме того, вы не можете использовать свои классы в другой базе данных с разными именами для таблиц и столбцов.
Поэтому я предпочитаю использовать свободный API в DbContext.OnModelCreating
Давайте сначала определим классы User и Message
class User
{
public int Id {get; set;}
... // other properties
// every User has zero or more "From" messages (one-to-many)
public virtual ICollection<Message> FromMessages {get; set;}
// every user has zero or more "To" message (one-to-many)
public virtual ICollection<Message> ToMessages {get; set;}
}
class Message
{
public int Id {get; set;}
... // other properties
// every Message has exactly one "From" user using foreign key FromUserId
public int FromUserId {get; set;}
public virtual User From {get; set;}
// every Message has exactly one "To" user using foreign key ToUserId
public int ToUserId {get; set;}
public virtual User To {get; set;}
}
В Entity Framework столбцы вашей таблицы представлены не виртуальными свойствами;виртуальные свойства представляют отношения между таблицами.
Следовательно, внешние ключи не являются виртуальными, а элементы, на которые указывают внешние ключи, являются виртуальными.
Время использовать свободный API:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
var messageEntity = modelBuilder.Entity<Message>();
// every messages belongs to exactly one User using foreign key `FromUserId`
// every such User has zero or more From messages
messageEntity.HasRequired(message => message.From)
.WithMany(user => user.FromMessages)
.HasForeignKey(message => message.FromUserId)
// the same for To, using ToUserId:
messageEntity.HasRequired(message => message.To)
.WithMany(user => user.ToMessages)
.HasForeignKey(message => message.ToUserId);
}
Вы также можете сделать это наоборот, начиная с Users:
var userEntity = modelBuilder.Entity<User>();
// every user has zero or more FromMessages (one-to-many)
userEntity.HasMany(user => user.FromMessages)
.WithRequired(message => message.From)
.HasForeignKey(message => message.FromUserId);
// every user has zero or more ToMessages (one-to-many)
userEntity.HasMany(user => user.ToMessages)
.WithRequired(message => message.To)
.HasForeignKey(message => message.ToUserId);