Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用筛选行作为派生类的DBContext的一部分_C#_Asp.net Mvc_Entity Framework_Dbcontext_Ef Core 3.1 - Fatal编程技术网

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();