首页 > 解决方案 > 将过滤后的行作为 DBContext 的一部分与派生类一起使用

问题描述

我想使用类继承来过滤数据库中不是绝对正常和关系的行。有通过 EF Coreentities映射到模型的表:Entity

[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和使用过滤吗?EntitiesBDBContext

我想至少以愚蠢的方式写它:

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

但是存在类转换问题(因为代码返回 List,而不是 List),而且它不像 ORM 风格的解决方案,EntitiesA 不是 DBSet,自动加载查询等等。

标签: c#asp.net-mvcentity-frameworkdbcontextef-core-3.1

解决方案


我认为将 EntitiesA 和 EntitiesB 带到 DBContext 不是一个好主意。因为基本上,它包含了一些应用领域知识(业务层),应该和你的 DBContext(数据访问层)完全解耦。

我建议在业务层中有一个 EntityLoader,它负责从 DB 加载实体并返回 EntityA 或 B 的列表。

关于类转换问题,您可以使用以下方法修复编译错误

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

但是,您将收到运行时错误,因为 Entity 类型没有 EntityA 类型那么具体。这意味着您需要像这样转换

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

推荐阅读