Игнорирование базового типа в Entity Framework Core 9 сначала кодаC#

Место общения программистов C#
Ответить
Anonymous
 Игнорирование базового типа в Entity Framework Core 9 сначала кода

Сообщение Anonymous »

Обычно я использую следующие интерфейсы для сущностей EF Core (.NET 9, EF Core 9):

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

public interface IEntity
{
// Identity column.
public long Id { get; set; }
public bool IsAuditable { get; set; }
public DateTime DateTimeCreated { get; set; }
public DateTime? DateTimeModified { get; set; }
}

public interface IEntity:
IEntity
where TEntity: class, IEntity, IEntity, new()
{ }
Сейчас я рассматриваю возможность использования конкретных базовых классов для всех объектов.
Рассмотрим следующую иерархию:

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

// Acts as a based class for all entities in the DbContext.
public class EntityBase
IEntity
where TEntity : class, IEntity, IEntity, new()
{
// Identity column.
public long Id { get; set; }
public bool IsAuditable { get; set; }
public DateTime DateTimeCreated { get; set; }
public DateTime? DateTimeModified { get; set; }
}

public class DocumentBase : EntityBase
{
public string Name { get; set; }
}

public class ElementBase : EntityBase
{
public string Name { get; set; }
}

// Should represent a database table with all properties
// from the base class but without a discriminator column.
public class Document : DocumentBase
{
public virtual ICollection Elements { get; set; } = [];
}

// Should represent a database table with all properties
// from the base class but without a discriminator column.
public class Element : ElementBase
{
public long DocumentId { get; set; }
public virtual Document Document { get; set; }
}

public class ApplicationDbContext : DbContext
{
public DbSet Documents { get; set; }
public DbSet Elements { get; set; }
}
На несколько вещей следует обратить внимание:
  • Ни DocumentBase, ни ElementBase не должны должны быть абстрактными (при необходимости у нас должна быть возможность пометить их как абстрактные)
  • DbContext не должен ничего знать об этих базовых классах, кроме их свойств (как если бы они были объявлены в конкретных классах)
  • Единственное сходство между различными сущности сойдутся в ConcreteEntity > ConcreteEntityBase > EntityBase. Никакие другие пути рассматриваться не должны
Результирующие таблицы должны иметь следующие объявления БЕЗ столбца дискриминатора (без TPH, TPT):Столы:
  • Код: Выделить всё

    Document
    (Id, IsAuditable, DateTimeCreated, DateTimeModified, Name, Elements)
  • (Id, IsAuditable, DateTimeCreated, DateTimeModified, Name, Document, DocumentId)
Лучшим ресурсом, который я нашел, был этот блог, в котором обсуждалась таблица для каждого конкретного случая. Type (TPC), но ему уже больше десяти лет, а я пытаюсь разобраться в EF Core 9.
Обратите внимание, что этот вопрос не касается выбора дизайна. или мой подход соответствует лучшим практикам. Я просто хочу знать, можно ли этого добиться с помощью EF9, и если да, то какая конфигурация необходима.

Подробнее здесь: https://stackoverflow.com/questions/792 ... code-first
Ответить

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

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

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

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

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