EF Core «нет такой таблицы» при использовании базового класса - PullRequest
0 голосов
/ 24 февраля 2020

Для начала, У меня есть структура сущностей, которую я не могу изменить .

В моей базе данных есть таблица Person и таблица Users (для контекста этого вопроса).

CREATE TABLE [Person] ...
CREATE TABLE [User] ...

Мои объекты используют некоторое наследование

public abstract PersonBase
{
    public string Id { get; set; }
    // person meta data
}

public class Person : PersonBase
{
    // additional data for app 1
}

public class User 
{
    public string PersonId { get; set; }
    public PersonBase Person { get; set; } // I cannot change this #sadpanda
}

Когда я пытаюсь настроить отношение

public class UserConfiguration : IEntityTypeConfiguration<User>
{
    public void Configure(EntityTypeBuilder<User> builder)
    {
        builder.HasOne(x => x.Person).WithMany().HasForeignKey(x => x.PersonId);
    }
}

И впоследствии пытаюсь запросить его, EF Core генерирует следующий запрос

SELECT ...
FROM "User" AS "e"
LEFT JOIN (
    SELECT "e0".*
    FROM "PersonBase" AS "e0"
    WHERE "e0"."Deleted" = 0
) AS "t" ON "e"."PersonId" = "t"."Id"
....

И я получаю ошибку

Ошибка SQLite 1: «нет такой таблицы: PersonBase».

Есть ли способ настроить это так, чтобы при попытке увлажнения User.Person EF использовал Person таблица из базы данных, хотя тип сущности PersonBase?

примечание: для повторения я не могу изменить структуру сущности, но у меня есть полный контроль над моей конфигурацией сущности.

Я попытался настроить мою конфигурацию со строками

builder.HasOne("Person").WithMany().HasForeignKey("PersonId");

Но затем он пожаловался на теневое состояние

Тип сущности «Персона» находится в теневом состоянии. Действительная модель требует, чтобы все типы сущностей имели соответствующий тип CLR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...