gpt4 book ai didi

c# - 为什么 EF 在表中插入重复项?

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:46 25 4
gpt4 key购买 nike

我的模型类看起来像这样:

 public class Car {
public int Id { get; set; }
public string Make { get; set; }
public string Model { get; set; }
}

ApplicationDbContext 类:

public class ApplicationDbContext : DbContext {
public DbSet<Car> Cars { get; set; }

public ApplicationDbContext()
: base("Rental") {
Configuration.LazyLoadingEnabled = true;
}
}

和种子方法:

 protected override void Seed(ApplicationDbContext context) {

context.Cars.AddOrUpdate(c => c.Id,
new Car { Id = 1, Make = "BMW", Model = "750i" },
new Car { Id = 2, Make = "Audi", Model = "A6" },
new Car { Id = 3, Make = "Honda", Model = "Civic" }
);
}

我在程序包管理器控制台中执行(任意多次)update-database 后,这些对象将被添加到数据库中。

但是在我添加了 Car 类的子类之后:

public class Car {
public int Id { get; set; }
public string Make { get; set; }
public string Model { get; set; }
public virtual ICollection<Rental> Rentals { get; set; }
}

public class JetCar : Car {
public int Thrust { get; set; }//kN
}

public class Dragster : Car {
public double Acceleration { get; set; }
}

然后修改ApplicationDbContext:

 public class ApplicationDbContext : DbContext {
public DbSet<Car> Cars { get; set; }
public DbSet<JetCar> JetCars { get; set; }
public DbSet<Dragster> Dragsters { get; set; }
public ApplicationDbContext()
: base("Rental") {
Configuration.LazyLoadingEnabled = true;
}
}

然后是种子法

    protected override void Seed(ApplicationDbContext context) {

context.Cars.AddOrUpdate(c => c.Id,
new Car { Id = 1, Make = "BMW", Model = "750i" },
new Car { Id = 2, Make = "Audi", Model = "A6" },
new Car { Id = 3, Make = "Honda", Model = "Civic" }
);

context.Dragsters.AddOrUpdate(d => d.Id,
new Dragster { Id = 4, Make = "Chevy", Acceleration = 3.23, }
);

context.JetCars.AddOrUpdate(d => d.Id,
new JetCar { Id = 4, Make = "Jetty", Thrust = 89 }
);

}

然后在我执行 update-database 之后,我得到了原始本田、宝马和奥迪汽车的副本,但鉴别器设置为 Car。为什么会这样?如何预防?

最佳答案

您有重复项,因为对于 Entity FrameWork,它们是不同的。当您使用继承时,EF 保留同一张表,但带有鉴别器。请注意,如果没有继承,则没有鉴别器(不需要它)。

您首先添加的 Cars 是真正的 Car 类型,但由于(目前)不存在继承,因此 EF 不会添加鉴别器。添加 DragsterJetCar 时,EF 现在需要 Discriminator。

由于您添加的第一辆汽车没有鉴别器,因此 EF 无法识别它们。现在,EF 在查询 Car 类型时寻找 Discriminator = 'Car'。

您可以更改种子脚本并手动调整一些数据(您可以在添加 DragsterJetCar 的迁移中添加手动查询) 或者您应该将继承交换为 2 个表之间的链接。

关于c# - 为什么 EF 在表中插入重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39468419/

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