c# - 将过滤后的行作为 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
和使用过滤吗?EntitiesB
DBContext
我想至少以愚蠢的方式写它:
public List<EntityA> EntitiesA
{
get
{
return Entity.Where(x => x.Type == "A").ToList();
}
}
但是存在类转换问题(因为代码返回 List,而不是 List),而且它不像 ORM 风格的解决方案,EntitiesA 不是 DBSet,自动加载查询等等。
解决方案
我认为将 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();
推荐阅读
- javascript - 是否可以撤销网络推送通知
- php - 使用传递给 PHP 函数的 php 变量重复 HTML 元素
- kendo-react-ui - 条件多选数据
- stored-procedures - 如何在 Dapper 中插入后读取 SELECT
- sql - 使用 selectRaw 和 LIKE 的 SQL、Laravel 得分/排名结果?
- automation - 如何解决,在符号编辑器中为符号激活“操作员控制和监视”的问题?
- python - 从 keras_squeezenet 导入时,我收到了导入错误
- asp.net-core - 如果 nuget 包依赖项位于 .NetFramework 和 .NetStandard - 它是否与 .Net 核心兼容并在 Linux 上运行?
- c# - 如何关闭 ASP.NET ZERO 的 JS 捆绑
- ios - iOS 在空闲超过 30 秒后快速发送消息