Итак, вот что здесь происходит:
1) Есть два класса: Comment
и User
.
2) Третий класс, Like
, содержит ссылки(свойства навигации) обоим двум тем классам, которые соответствуют внешним ключам в базе данных: UserId
и CommentId
.Я явно использовал атрибут ForeignKey
, чтобы вам было понятно, какие свойства EF будет использовать в качестве внешних ключей.В этом конкретном случае вы можете опустить этот атрибут, так как EF выяснит это автоматически (поскольку имена совпадают в обоих классах).Обратите внимание, что наличие внешних ключей не обязательно, но они имеют преимущества.
3) UserId
и CommentId
составляют составной ключ.Атрибут Column
настраивает порядок столбцов в базе данных (так называемые порядковые номера).Это важно для EF.
4) Классы User
и Comment
также имеют навигационные свойства (поскольку это one
сторона отношений one-to-many
): Likes
.
5) Наконец, always
используйте атрибут Table
, чтобы избежать проблем с множественными числами, потому что нет способа отключить его.
[Table("Comment")]
public class Comment
{
public int CommentID { get; set; }
public List<Like> Likes { get; set; }
}
[Table("User")]
public class User
{
public int UserId { get; set; }
public List<Like> Likes { get; set; }
}
[Table("Like")]
public class Like
{
[Key]
[Column(Order = 1)]
public int CommentID { get; set; }
[Key]
[Column(Order = 2)]
public int UserID { get; set; }
[ForeignKey("CommentId")]
public Comment Comment { get; set; }
[ForeignKey("UserId")]
public User User { get; set; }
}
UPDATE
Установка составного ключа в EF Core
Атрибуты Key
(и Column
), используемые для обозначения составного первичного ключа, фактически не работают в EFОсновные - они работают в EF6.Чтобы настроить составной ключ в EF Core, необходимо использовать Fluent Configuration.
У вас есть два варианта сделать это.
ОПЦИЯ 1. Выполнить всю конфигурацию в OnModelCreatingMethod
:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Like>().HasKey(l => new { l.CommentID, l.UserID });
}
ОПЦИЯ 2. Переместить всю конфигурацию в отдельный класс и применить ее в OnModelCreating
:
1) Создать отдельный класс для конфигурации
class LikeConfiguration : IEntityTypeConfiguration<Like>
{
public void Configure(EntityTypeBuilder<Like> builder)
{
builder.HasKey(l => new { l.CommentID, l.UserID });
}
}
2) Применить конфигурацию:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfiguration(new LikeConfiguration());
}
Выберите любую понравившуюся опцию.
Как видите, для настройки составного ключа в Fluent Configuration вам необходимо использовать анонимный тип .И снова, порядок свойств имеет значение.