Как использовать внешний ключ в качестве составного ключа в EF Core 2? - PullRequest
0 голосов
/ 18 января 2019

У меня есть несколько классов в EF Core 2. 1) Класс Сер

  • имеет идентификатор типа Guid. Это первичный ключ, автоинкрементный.

2) Класс SerStaHis

  • имеет SerId в качестве типа Guid. Это внешний ключ для класса Ser. Это первичный ключ с отметкой времени

  • имеет метку времени. Это первичный ключ с SerId

Я использую EF Core 2 для построения двух таблиц выше. Я использовал функцию составного ключа для объединения SerStaHis.timestamp и SerStaHis.SerId в качестве первичного ключа.

Я также использую атрибут ForeignKey в Class Ser. Проблема в том, что мне удалось сопоставить внешний ключ с классом SerStaHis, но я не смог объединить этот внешний ключ с SerStaHis.timestamp в качестве первичного ключа.

Вот фрагменты кода для метода Class Ser, Class SerStaHis и OnModelCreating.

public class Ser {
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]   // auto-incrementing feature
    public Guid id { get; set; }

    //nav/foreign keys
    [ForeignKey("id")]
    public virtual ICollection<SerStaHis> SerStaHis{ get; set; }
}

public class SerStaHis{
    [Required] // maybe this is wrong as I got a foreign key from Class Ser
    public Guid service_id { get; set; }
    [Required]
    public DateTime timestamp { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder) {
        base.OnModelCreating(modelBuilder);

        // composite primary keys method. // https://docs.microsoft.com/en-us/ef/core/modeling/keys
        modelBuilder.Entity<SerStaHis>()
            .HasKey(c => new {c.service_id, c.timestamp});
    }

Вот фактический результат, который я получил при переходе на SQL: actual result

Мой ожидаемый результат в SQL выглядит следующим образом: expected result

Пожалуйста, дайте мне знать, если вам нужно больше разъяснений.

Можно ли выполнить вышеуказанную задачу в методе FluentAPI?

Как использовать внешний ключ в качестве составного первичного ключа?

Спасибо

1 Ответ

0 голосов
/ 18 января 2019

Изменение атрибута

[ForeignKey("id")]
public virtual ICollection<SerStaHis> SerStaHis{ get; set; }

на

[ForeignKey("service_id")]
public virtual ICollection<SerStaHis> SerStaHis{ get; set; }

ForeignKey работает по-разному при применении к свойству FK, свойству ссылочной навигации и свойству навигации по коллекции.При применении к свойству навигации по коллекции оно задает имя свойства FK для связанного объекта.

Лично я считаю атрибут ForeignKey сбивающим с толку и подверженным ошибкам.Свободный API намного более интуитивен и обеспечивает намного лучший контроль.Свободная конфигурация для вашего сценария выглядит следующим образом:

modelBuilder.Entity<Ser>()
    .HasMany(ser => ser.SerStaHis) // collection navigation property
    .WithOne() // no reference navigation property
    .HasForeignKey(serStaHis => serStaHis.service_id); // foreign key property
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...