为什么EF在表中插入了重复项?

时间:2016-09-13 11:02:16

标签: c# entity-framework

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

 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。为什么会这样?如何防止这种情况?

2 个答案:

答案 0 :(得分:1)

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

您首先添加的汽车是真正的Car类型,但由于继承不存在(尚未),EF不会添加鉴别器。 当您添加DragsterJetCar时,EF现在需要Discriminator。

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

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

答案 1 :(得分:0)

您必须如下所示测试所有种子对象。

console\models\