C# 使用筛选行作为派生类的DBContext的一部分
我想使用类继承来过滤数据库中的行,这不是绝对正常的和关系的。表C# 使用筛选行作为派生类的DBContext的一部分,c#,asp.net-mvc,entity-framework,dbcontext,ef-core-3.1,C#,Asp.net Mvc,Entity Framework,Dbcontext,Ef Core 3.1,我想使用类继承来过滤数据库中的行,这不是绝对正常的和关系的。表实体通过EF核心映射到模型实体: [Table("entities")] public class Entity { public int Id { get; set; } public string Type { get; set; } } 类型是一些可以是“A”或“B”的字符串,例如 我想为类型为A的实体指定类EntityA:Entity,并相应地为类型为B的实体指定类: public class EntityA
实体
通过EF核心映射到模型实体
:
[Table("entities")]
public class Entity
{
public int Id { get; set; }
public string Type { get; set; }
}
类型
是一些可以是“A”或“B”的字符串,例如
我想为类型为A的实体指定类EntityA:Entity
,并相应地为类型为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; }
// ...
}
但是存在类转换问题(因为代码返回列表,而不是列表),而且它不像ORM样式的解决方案,EntitiesA不是DBSet,自动加载查询等等。好的,我发现,它在EF Core中被称为
鉴别器,感兴趣的人可以在这里阅读:我认为将EntitiesA和EntitiesB引入DBContext不是一个好主意。因为基本上,它包含一些应用程序领域知识(业务层),这些知识应该与DBContext(数据访问层)完全解耦
我建议在业务层有一个EntityLoader,负责从DB加载实体并返回EntityA或B的列表
关于类转换问题,您可以使用
return Entity.Where(x => x.Type == "A").Select(x => (EntityA)x).ToList();
但是,由于实体类型不如EntityA类型具体,因此将出现运行时错误。这意味着你需要像这样转换
return Entity.Where(x => x.Type == "A").Select(x => new EntityA(....)).ToList();
它实际上是数据层逻辑,而不是业务逻辑。因为它是为cms创建的外部数据库,与asp应用程序没有类似之处。对于asp应用程序中的数据层,如果我们从头开始使用asp应用程序,最好将此表中的行理解为不同的模型,这些模型应该是不同的表。在EF Core Discriminator中,您仍然需要一个用于EntityA的DB表和一个用于EntityB的DB表。但在您的问题中,您说实体只有一个表。我可能误解了你的问题。不,是关于普通桌子的。你们可以从我的答案中打开链接——甚至有一张表格生成不同实体的截图
return Entity.Where(x => x.Type == "A").Select(x => new EntityA(....)).ToList();