#c# #entity-framework-core #ef-core-3.1
Вопрос:
У меня возникла ситуация, когда я не смог правильно извлечь свой зависимый класс с помощью включения в EF Core 3.1 при извлечении основного. Эта ситуация может немного отличаться от документов MS, так как в зависимом классе PK и FK находятся в одном поле, FileDefinitionId
Несмотря на весь приведенный ниже код, определение файла.Значение FileImportDefinition равно null.
Есть ли что-то, что я упустил? Я следил за документами Microsoft по этому вопросу
fileDefinition = context.FileDefinitions
.AsNoTracking()
.Include(x => x.FileImportDefinition)
.FirstOrDefault(p => p.FileDefinitionId == fileDefinitionId);
Главный
public partial class FileDefinition
{
public long FileDefinitionId { get; set; }
public virtual FileImportDefinition FileImportDefinition { get; set; }
}
Зависимый
public partial class FileImportDefinition
{
public long FileDefinitionId { get; set; }
public virtual FileDefinition FileDefinition { get; set; }
}
OnModelBuilding — определение файла (принципал)
entity.HasOne(d => d.FileImportDefinition)
.WithOne(p => p.FileDefinition)
.IsRequired(false)
.HasForeignKey<FileImportDefinition>(d => d.FileDefinitionId)
.HasConstraintName("FK_FileImportDefinitions_FileDefinitions")
.OnDelete(DeleteBehavior.ClientSetNull);
Комментарии:
1. «как и в зависимом классе, PK и FK находятся в одном поле» На самом деле это (называемое общей ассоциацией PK) является значением по умолчанию для отношений EF Core один к одному. Ваш пример работает для меня (EFC 3.1.19, SQLServer) — свойство навигации загружено, как и ожидалось. У вас есть некоторые конфликтующие / неприменимые конфигурации для этого типа отношений (
IsRequired(false)
,DeleteBehavior.ClientSetNull
), которые обычно игнорируются EFC, но безопаснее не полагаться на это, т. Е. Удалить первую (PK всегда требуется) и изменить вторую наDeleteBehavior.Restrict
.2. Спасибо @IvanStoev, я бы определенно отметил это как ответ, если бы мог. Еще одна проблема, которую я заметил, заключалась в том, что мой класс использовал System.Data.Entity вместо Microsoft. EntityFrameworkCore для методов контекстной компоновки (проект миграции EF6 > EFCore)