Использование отфильтрованных строк как части DBContext с производным классом - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу использовать наследование классов для фильтрации строк в базе данных, которая не является абсолютно нормальной и реляционной. Существует таблица entities, сопоставленная с моделью Entity через EF Core:

[Table("entities")]
public class Entity
{
    public int Id { get; set; }
    public string Type { get; set; }
}

Type - это строка, которая может быть "A" или "B", например,

Я хочу указать класс EntityA : Entity для сущностей с типом A и, соответственно, для B:

public class EntityA : Entity
{
    // some unique A properties
}

public class EntityB : Entity
{
    // some unique B properties
}

В основном мой DBContext выглядит как

public class ApplicationContext : DbContext
{
    public DbSet<Entity> Entities { get; set; }

    // ...
}

Можно ли определить EntitiesA и EntitiesB в мой DBContext с использованием фильтрации по типу?

Я хотел написать по крайней мере глупо:

public List<EntityA> EntitiesA
{
    get
    {
        return Entity.Where(x => x.Type == "A").ToList();
    }
}

Но есть проблема приведения классов (потому что код возвращает List, а не List) а также это не похоже на решение в стиле ORM, EntitiesA - это не DBSet, автоматически загружать запрос и т. д.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Я не думаю, что это хорошая идея - перенести EntitiesA и EntitiesB в DBContext. Потому что в основном он содержит некоторые знания предметной области приложения (бизнес-уровень), которые должны быть полностью отделены с вашим DBContext (уровень доступа к данным).

Я предлагаю иметь EntityLoader в бизнес-уровне, который отвечает за загрузку Объекты из БД и возвращаемого списка EntityA или B.

Что касается проблемы приведения классов, вы можете исправить ошибку компиляции с помощью

return Entity.Where(x => x.Type == "A").Select(x => (EntityA)x).ToList();

Однако вы получите ошибку времени выполнения, так как Entity Тип меньше c, чем тип EntityA. Что означает, что вам нужно конвертировать, как это

return Entity.Where(x => x.Type == "A").Select(x => new EntityA(....)).ToList();
0 голосов
/ 27 февраля 2020

Хорошо, я нашел, это называется Discriminator в EF Core, те, кто заинтересован, могут прочитать здесь: https://docs.microsoft.com/en-us/ef/core/modeling/inheritance

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