Я думаю, вам нужно немного подправить свои модели.Прямо сейчас в таблице InfoRecord
есть три столбца, указывающие на таблицу файлов.Проблема в том, что если завтра вам понадобится больше файлов?Добавление большего количества столбцов не является оптимальным.Процесс исправления это то, что называется Нормализация базы данных .
Если InfoRecord
требуется «несколько столбцов для указания идентификатора» на FileUpload
, у вас есть отношение one-to-many
- один InfoRecord
может иметь один или несколько файлов.Мы можем добиться нормализации, используя 3 таблицы:
1 - FileUpload
(фактические файлы, самая основная сущность. Здесь никаких связей нет.)
public class FileUpload
{
public long Id { get; set; }
public string FileName { get; set; }
public string FilePath { get; set; }
}
2 - InfoRecord
- Как вашвопрос, InfoRecord может иметь много файлов:
public class InfoRecord
{
public long Id { get; set; }
public string Title { get; set; }
public ICollection<FileUploadRecord> Files { get; set; }
}
И, наконец, сущность, которая «склеивает» их вместе:
3 - FileUploadRecord
- имеет FK
к FileUpload
и InfoRecord
public class FileUploadRecord
{
public long Id { get; set; }
// FK to InfoRecord. Usefull for update scenarious
// without having to load the whole entity.
public long InfoRecordId { get; set; }
public InfoRecord InfoRecord { get; set; }
// FK To the actual file upload
public long FileId { get; set; }
public FileUpload FileUpload { get; set; }
}
Затем вы можете настроить его с помощью FluentAPI
следующим образом:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Configure the Entity that "glues" InfoRecord and FileUploads.
// One InfoRecord can have many files, so we need a table to store that relationship.
modelBuilder.Entity<FileUploadRecord>()
.HasOne(s => s.InfoRecord)
.WithMany(g => g.Files)
.HasForeignKey(s => s.InfoRecordId);
modelBuilder.Entity<FileUploadRecord>()
.HasOne(p => p.FileUpload)
.WithMany()
.HasForeignKey(p => p.FileId);
}
И запросить с помощью .Include
, как вы хотели, легкосейчас.Запрос ниже загружает все InfoRecords
с каждым соответствующим файлом.
var recordsWithFiles = context.InfoRecords
.Include(p => p.Files)
.ThenInclude(p => p.FileUpload);
Вот так будет выглядеть схема БД:
Согласно "another_table", это выглядит как простое отношение one-to-one
таким образом, вы можете просто использовать для него простые EF Core Conventions .Конечно, .Include
также работает здесь.
public class AnotherTableRecord
{
public long Id { get; set; }
// FK To the actual file upload
public long ImageId { get; set; }
public FileUpload Image { get; set; }
}