У нас есть абстрактный базовый класс универсального типа TParentType:< /p>
Код: Выделить всё
[Table("Documents")]
public abstract class Document : EntityWithSecurity, IDocument
{
// ...
}
Код: Выделить всё
public class ItemDocument : Document, IItemDocument
{
// ...
}
public class LibraryDocument : Document, ILibraryFolderDocument
{
// ...
}
Код: Выделить всё
DocumentМы только недавно добавили общий тип, и он прекрасно работал без него со следующей конфигурацией DbContext:
Код: Выделить всё
public virtual DbSet Documents { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity()
.HasDiscriminator("DocumentType")
.HasValue(DocumentType.ItemDocument)
.HasValue(DocumentType.LibraryDocument);
// ...
}
Код: Выделить всё
public virtual DbSet Documents { get; set; }
Поскольку в Entity Framework Core по умолчанию используется TPH, мы попытались удалить DbSet. и настройка TPH и замена на DbSet для каждого отдельного типа:
Код: Выделить всё
public virtual DbSet ItemDocuments { get; set; }
public virtual DbSet LibraryDocuments { get; set; }
Невозможно использовать таблицу «Документы» для типа объекта. «LibraryDocument», поскольку он используется для типа сущности «ItemDocument» и, возможно, для других типов сущностей, но связь связи отсутствует. Добавьте внешний ключ в «LibraryDocument» в свойствах первичного ключа и укажите на первичный ключ другого типа сущности, сопоставленного с «Документами».
И не В любом случае это кажется неправильным, поскольку это позволяет избежать основной проблемы невозможности настройки типа Document в DbContext из-за универсального типа. И я считаю, что это также помешает нам получить список документов базового типа из базы данных.
Как мне это сделать? Имея в виду, что нам нужен TPH и возможность извлекать базовые и производные классы из репозитория, например:
Код: Выделить всё
private readonly IRepository _documentRepository;
private readonly IRepository _itemDocumentRepository;
// ...
_documentRepository.GetAll().ToListAsync();
_itemDocumentRepository.GetAll().ToListAsync();
Например, доступно ли что-то вроде этого:
Код: Выделить всё
public virtual DbSet
Подробнее здесь: [url]https://stackoverflow.com/questions/79193063/type-per-hierarchy-inheritance-with-an-abstract-generic-base-class[/url]
Мобильная версия