EF Core с наследованием и сопоставлением Automapper: как запросить и отобразить представление SQL с наследованием - PullRequest
0 голосов
/ 24 июня 2019

У меня есть старая таблица MySQL, которую я создал с помощью Entity Framework Core (2.2), используя Pomelo. Мне пришлось создать представление SQL, чтобы вывести список всех пользователей, имитирующих наследование, с помощью столбца дискриминатора.

Итак, у меня есть несколько классов, сопоставленных с одним представлением SQL. Базовый класс - ViewUser, а унаследованные - ViewUserCollaborator, ViewUserClient, ... Конфигурация EF Core:

public DbQuery<ViewUser> ViewUsers { get; set; }

[...]

modelBuilder.Query<ViewUser>(entity =>
{
    entity.ToView("v_users")
        .HasDiscriminator<string>("discriminator")
        .HasValue<ViewUserClient>("Client")
        .HasValue<ViewUserCollaborator>("Collaborator")
        .HasValue<ViewUser>("User");
}

Теперь у меня есть хранилище, которое предоставляет доменные сущности с одинаковым наследованием, но разными классами и свойствами. Базовый класс - User, а унаследованные - Collaborator, Client, ...

Я получил несколько конфигураций AutoMapper:

CreateMap<ViewUser, User>()
                .Include<ViewUserCollaborator, Collaborator>()
                .Include<ViewUserClient, Client>()
                .ForMember(e => e.Id, opts => opts.MapFrom(m => m.UserId))
                ...;

            CreateMap<ViewUserClient, Client>()...;

            CreateMap<ViewUserCollaborator, Collaborator>()...;

Используя мой репозиторий, я хотел бы опросить всех пользователей, получающих наследование, на основе SQL View. Я звоню Пользователям и получаю список Пользователей с наследованием; например: Users.OfType () возвращает непустой список.

Я пытался использовать проекцию, но наследство не сохранилось.

return Context.ViewUsers.ProjectTo<User>();

Я пытался отобразить в запросе. Это работает, но производительность действительно низкая, потому что сопоставление выполняется во время запроса, а не во время перечисления.

return from u Context.ViewUsers
       select u.Discriminator == "Collaborator" ? Map<Collaborator>(u) :
              u.Discriminator == "Client" ? Map<Client>(u) :
              Map<User>(u);

Скажите, если я ошибаюсь, но я думаю, что есть только два возможных способа: "проектировать" с наследованием или отображать карту во время перечисления, но я не нашел, как.

И, чтобы добавить некоторую сложность, мне нужно получить другие данные только для определенного типа пользователя (например, присоединиться к UserDepartment, если пользователь является Collaborator), но у меня есть несколько других способов сделать это.

Моя главная проблема - собрать всех пользователей с наследованием одним запросом.

Спасибо за вашу помощь!

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