Проблема не в конкретном запросе, а в отображении модели.
Во-первых, атрибут ForeignKey
здесь
[ForeignKey("CharacterReplacementSets")]
public int CharacterReplacementSetID { get; set; }
не имеет никакого эффекта. При применении к свойству навигации предполагается указание имени свойства FK . И при применении к свойству FK, как здесь, он должен указывать имя навигации свойство . CharacterReplacements
не имеет свойства навигации с именем CharacterReplacementSets
, поэтому атрибут просто игнорируется. Было бы хорошо, если EF Core генерирует ошибку времени выполнения, чтобы указать на проблему с отображением, но это не так.
Атрибут также был проигнорирован в EF Core 1.x / 2.x. Однако это сработало, потому что имя свойства CharacterReplacementSetID
совпадает с именем PK CharacterReplacementSets
. Это больше не относится к EF Core 3.0 из-за следующего критического изменения - Соглашение о свойствах внешнего ключа больше не совпадает с именем основного свойства .
Поэтому удалите неверное и вводящее в заблуждение ForeignKey
и настройте свойство FK с помощью HasForeignKey
fluent API (мой предпочтительный вариант):
modelBuilder.Entity<CharacterReplacementSets>()
.HasMany(e => e.CharacterReplacements)
.WithOne()
.HasForeignKey(e => e.CharacterReplacementSetID);
или с атрибутом ForegnKey
для свойства навигации (или свойства обратной навигации, если свойство навигации отсутствует). как здесь):
[ForeignKey("CharacterReplacementSetID")]
public ICollection<CharacterReplacements> CharacterReplacements { get; set; }
Обратите внимание, что у вас может быть похожая проблема с FormatField
и другими объектами, использующими аналогичные именованные FK без свойств навигации.
Еще один способ избежать этой проблемы -использовать уникальные имена классов сущностей, такие как CharacterReplacementSet
, CharacterReplacement
и т. д., поскольку [entity name] + ID
по-прежнему соответствует соглашениям EF Core. И вообще, имена в единственном числе лучше / предпочтительнее, даже для удобства чтения.