gpt4 book ai didi

c# - 在 EF4 Code-First 中按基本类型查询

转载 作者:太空狗 更新时间:2023-10-29 22:23:44 26 4
gpt4 key购买 nike

我有以下类型:

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; }
}

如果我直接查询汽车或摩托车,这非常有用...

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

但是如果我想要所有车辆的列表,无论是汽车还是摩托车,我想这样做:

var dbContext = new MyDbContext();
var vehicles = dbContext.Set<Vehicle>().Where(x=> x.TopSpeed>10); // <-- THIS DOES NOT WORK

当我尝试上面的代码时,出现异常:

System.InvalidOperationException : The entity type Vehicle is not part of the model for the current context.

这很有道理……我没有将 Vehicle 添加到上下文中。我添加了汽车和摩托车。在这一点上,我不知道该怎么做。我尝试将 Vehicle 添加到我的上下文中,但这将 car 和 moto 的表组合到了一个 Vehicle 表中。我绝对想要一张单独的汽车和摩托车表(可能还有一张用于车辆基本属性的表)。执行此操作的最佳方法是什么?

最佳答案

在您的 MyDbContext 类中有一个类型为 Vehicle 的 Vehicles Properties。

public MyDbContext: DbContext { 
public DbSet<Car> Cars { get; set; }
public DbSet<Motorcycle> Motorcycles { get; set; }
public DbSet<Vehicle> Vehicles { set; get; }
}

现在您可以使用这样的条件访问所有车辆

var vehicles = dbContext.Set<Vehicle>().Where(x=> x.TopSpeed>10);

请记住,您的实体类中应该有一个关键属性(ID{ClassName}ID)。否则它会给你一个运行时错误! (是的,代码将编译。)

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

编辑:根据评论

默认情况下,Entity Framework 将执行一个Table Per Hierarchy。层次结构中的所有数据都保存在一个表中,它使用Discriminator 列来识别属于哪个记录哪个子类型。因此,作为结果,您将拥有一个 Vehicle 表,其中的列与层次结构中所有类的属性相同,还有一个名为“Discriminator”的额外列。对于 Car 的记录,它将在 Discriminator 列中具有“Car”值。

enter image description here

如果您想为每种类型创建单个表,我们将选择Table Per Type。 Entity Framework 将为基类创建一个表,并为所有子类创建单独的表。

要做到这一点,您可以使用 Fluent API 覆盖配置。

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

base.OnModelCreating(modelBuilder);
}

输出是

enter image description here

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

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

结果在这里

enter image description here

请注意,结果同时包含 MotorCycle 类型和 Car 类型。

检查这个link决定使用什么继承策略。

关于c# - 在 EF4 Code-First 中按基本类型查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10420075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com