我的模型类看起来像这样:
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" }
);
}
我在Package Manager Console中执行(我想要多次)update-database
后,这些对象被添加到数据库中。
但是在我添加了Car class的子类之后:
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
。为什么会这样?如何防止这种情况?
答案 0 :(得分:1)
您有重复项,因为对于Entity FrameWork,它们是不同的。 使用继承时,EF保留相同的表,但使用Discriminator。请注意,如果没有继承,则没有鉴别器(不需要它)。
您首先添加的汽车是真正的Car
类型,但由于继承不存在(尚未),EF不会添加鉴别器。
当您添加Dragster
和JetCar
时,EF现在需要Discriminator。
由于您首次添加的汽车没有鉴别器,因此EF无法识别它们。现在,EF在查询Car
类型时正在寻找Discriminator ='Car'。
您可以更改种子脚本并手动调整某些数据(您可以在添加Dragster
和JetCar
的迁移中添加manuel查询
或者你应该交换继承2个表之间的链接。
答案 1 :(得分:0)
您必须如下所示测试所有种子对象。
console\models\