Типовое наследование по иерархии с использованием абстрактного универсального базового класса.C#

Место общения программистов C#
Ответить
Anonymous
 Типовое наследование по иерархии с использованием абстрактного универсального базового класса.

Сообщение Anonymous »

Мы используем Entity Framework Core (сначала код) в приложении C# и ASP.NET Core.
У нас есть абстрактный базовый класс универсального типа TParentType:< /p>

Код: Выделить всё

[Table("Documents")]
public abstract class Document : EntityWithSecurity, IDocument
{
// ...
}
И несколько производных классов, каждый из которых предоставляет базовому классу универсальный тип. Ниже приведено несколько примеров, но всего у нас около 12 различных производных классов:

Код: Выделить всё

public class ItemDocument : Document, IItemDocument
{
// ...
}

public class LibraryDocument : Document, ILibraryFolderDocument
{
// ...
}
Мы хотим иметь наследование по типам для каждой иерархии, при котором все типы находятся в одной таблице. Базовый класс Document не может быть создан, но мы хотим иметь возможность вызывать базовый класс (

Код: Выделить всё

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);
// ...
}
Введение универсального типа усложнило ситуацию. Мы больше не можем использовать объект Document в DbContext:

Код: Выделить всё

public virtual DbSet Documents { get; set; }
потому что для документа требуется универсальный тип. То же самое касается конфигурации modelBuilder или любой ссылки на Document в DbContext.
Поскольку в 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();
Как я могу работать с типом Document в DbContext теперь, когда он имеет общий тип, чтобы я мог настроить настройку TPH так же, как выше, до того, как был введен универсальный тип?
Например, доступно ли что-то вроде этого:

Код: Выделить всё

public virtual DbSet

Подробнее здесь: [url]https://stackoverflow.com/questions/79193063/type-per-hierarchy-inheritance-with-an-abstract-generic-base-class[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»