Почему IMutableEntityType.BaseType имеет значение null для сущностей, которые наследуются непосредственно от базового класса? - PullRequest
1 голос
/ 01 июня 2019

Я определил следующие классы:

public class DeletableEntity
{
    public bool IsDeleted { get; set; }
}

public class ClassA : DeletableEntity
{
}

public class ClassB : ClassA
{        
}

В OnModelCreating я получаю только сущности, которые наследуются от DeletableEntity, как это:

    foreach (var entityType in builder.Model.GetEntityTypes())
    {
        if (typeof(DeletableEntity).IsAssignableFrom(entityType.ClrType) == true)
        {
            var et = entityType.BaseType;
        }
    }

Интересно, что ClassA имеет entityType.BaseType == null, но ClrType.BaseType ясно показывает, что ClassA наследует от DeletableEntity:

enter image description here:

Для ClassB entityType.BaseType является ClassA, как и ожидалось:

enter image description here

Почему родительский класс первого преемника игнорируется?Это специально?

PS: я использую EF Core 2.2.

1 Ответ

3 голосов
/ 01 июня 2019

Это потому, что есть разница между базовым классом и базовым сущностью .

IEntityType представляет класс, отображенный как EF Core сущность . Свойство типа BaseType для IEnityType также IEnityType. Но в вашем примере DeletableEntity это просто базовый класс, а не базовая сущность, поэтому свойство возвращает null.

Вероятно, лучшим объяснением является объявление свойства:

//
// Summary:
//     Gets the base type of the entity. Returns null if this is not a derived type
//     in an inheritance hierarchy.
IEntityType BaseType { get; }

где "иерархия наследования" относится к EF Наследование :

Наследование в модели EF используется для управления представлением наследования в классах сущностей в базе данных.

, а также Наследование (реляционная база данных) .

...