Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 首先在EF4代码中按基类型查询_C#_Entity Framework_Inheritance - Fatal编程技术网

C# 首先在EF4代码中按基类型查询

C# 首先在EF4代码中按基类型查询,c#,entity-framework,inheritance,C#,Entity Framework,Inheritance,我有以下几种: public abstract class Vehicle { public int Id { get; set; } public double TopSpeed { get; set; } } public class Car : Vehicle { public int Doors { get; set; } } public class Motorcycle : Vehicle { public string Color { get;

我有以下几种:

public abstract class Vehicle {
    public int Id { get; set; }
    public double TopSpeed { get; set; }
}

public class Car : Vehicle {
    public int Doors { get; set; }
}

public class Motorcycle : Vehicle { 
    public string Color { get; set; }
}
我有一个代码优先的DBContext:

public MyDbContext: DbContext { 
    public DbSet<Car> Cars { get; set; }
    public DbSet<Motorcycle> Motorcycles { get; set; }
}
public MyDbContext:DbContext{
公共数据库集车辆{get;set;}
公共DbSet摩托车{get;set;}
}
如果我直接查询汽车或摩托车,效果会很好

var dbContext = new MyDbContext();
var cars = dbContext.Set<Car>().Where(x=> x.TopSpeed>10); // <-- THIS WORKS
var dbContext=new MyDbContext();

var cars=dbContext.Set()。其中(x=>x.TopSpeed>10);//x、 顶速>10);// 在MyDbContext类中具有DBSet类型为
Vehicle
的车辆属性

public MyDbContext: DbContext { 
    public DbSet<Car> Cars { get; set; }
    public DbSet<Motorcycle> Motorcycles { get; set; }
    public DbSet<Vehicle> Vehicles { set; get; }
}
编辑:根据评论

默认情况下,实体框架将为每个层次结构创建一个。层次结构中的所有数据都保存在一个表中,并使用
鉴别器
列来标识哪个记录属于哪个子类型。因此,您将有一个Vehicle表,其中的列与层次结构中所有类的属性相同,并有一个名为“
Discriminator
”的额外列。对于Car记录,它将在鉴别器列中包含“Car”值

如果您想为每种类型创建一个表,我们将为每种类型创建一个表。实体框架将为基类创建一个表,并为所有子类创建一个单独的表

要实现这一点,您可以使用fluentapi覆盖配置

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Car>().ToTable("Cars");
        modelBuilder.Entity<Motorcycle>().ToTable("Motorcycles");

        base.OnModelCreating(modelBuilder);
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable(“汽车”);
modelBuilder.Entity().ToTable(“摩托车”);
基于模型创建(modelBuilder);
}
输出是

现在,您应该能够像这样查询车辆条目

var vehicles = dbContext.Set<Vehicle>().Where(x=> x.TopSpeed>10);
 var vehicles = dbContext.Set<Vehicle>().Where(x => x.TopSpeed > 150).ToList();
var vehicles=dbContext.Set().Where(x=>x.TopSpeed>150.ToList();
结果就在这里

请注意,结果同时包含
摩托车
类型和
汽车
类型


检查此项以决定使用何种继承策略。

您是否尝试过仅使用一个数据库集为车辆提供自己的上下文?我想这可能对你有用

在继承的类上使用DataAnnotation.Schema.Table(“TableName”)条目,触发为继承的类型创建新表(每个类型的表),并消除父类型表中的鉴别器字段,而不需要流畅的API代码。

EF不是我的事,但是,如果您将其添加到上下文中,例如将
Vehicle
更改为
IVehicle
,是否可以通过接口获取设置?正确。我忘了在我的示例中包括id道具。尝试了这个,它将我的汽车和摩托车合并到一个名为vehicles的表中。每种类型我都想要一张表。@NSGaga:有时候图像更有意义。这很容易理解。当我这样做的时候,查询是有效的,但是表被分解成一个。在每种类型的表之前。。。不是每个层次的表。所以,为了清楚起见,您有一个VehicleDbContext和一个MyDbContext(带有cars和moto),它仍然创建一个名为Vehicle的表?您使用什么创建表?另外,您是否尝试过在其上使用EDMX编写器以确保继承完全符合您的计划?
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Car>().ToTable("Cars");
        modelBuilder.Entity<Motorcycle>().ToTable("Motorcycles");

        base.OnModelCreating(modelBuilder);
    }
 var vehicles = dbContext.Set<Vehicle>().Where(x => x.TopSpeed > 150).ToList();