2 внешних ключа в качестве первичного ключа с использованием кода EF Core 2.0 - PullRequest
0 голосов
/ 17 мая 2018

У меня есть две таблицы: Комментарий и Как .

public class Comment {
  CommentID { get; set; }
  ....
}

public class Like {
  CommentID { get; set; }
  UserID { get; set; }
}

Сначала, используя код ядра 2.0 Entity Framework, я хочу определить мою модель «Мне нравится» как имеющую только два поля, которые ссылаются на другие первичные ключи (как внешние ключи), но также я хочу, чтобы комбинация значений была Первичным ключом. стола. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 17 мая 2018

Итак, вот что здесь происходит:

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

Атрибуты KeyColumn), используемые для обозначения составного первичного ключа, фактически не работают в 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 вам необходимо использовать анонимный тип .И снова, порядок свойств имеет значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...