首页 > 解决方案 > 更改我的类以使 ID 自动递增:实体框架

问题描述

我正在尝试使用 Entity Framework 创建数据库,但是当我add-migration initial在 nuget 包管理器控制台中运行命令时,出现此错误:

无法添加实体类型“汽车”的种子实体,因为属性“ID”需要非零值。考虑提供一个负值以避免与非种子数据发生冲突。

如何更改我的课程以使其正确自动递增?

这是我的课:

namespace Heck_16365660_AspNet_Asg5.Models
{
    public enum SortOrder
    {
        sortByMake,
        sortByYear,
        sortByPrice,
        sortByMileage,
        sortByColor,       
    }

    public class Car
    {
        public Car()
        {
        }

        public Car(int year, string makeModel, int price, int mileage, string color)
        {
            MakeModel = makeModel;
            Year = year;
            Price = price;
            Mileage = mileage;
            Color = color;
        }

        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }
        public string MakeModel { get; set; }
        public int Year { get; set; }
        public int Price { get; set; }
        public int Mileage { get; set; }
        public string Color { get; set; }
        public int Slug => ID;
        public SortOrder SortOrder { get; set; }            
    }
}

我还添加了一个 ID = -1; 到构造函数,然后我得到一个错误,内容如下:

无法添加实体类型“汽车”的种子实体,因为已经添加了另一个具有相同键值 {'ID'} 的种子实体。考虑使用“DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。

这是我的CarContext

public class CarContext : DbContext
{
        public CarContext(DbContextOptions<CarContext> options)
            : base(options)
        { }

        public DbSet<Car> Cars { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Car>().HasData(
                new Car(2013, "Nissan Sentra", 8995, 84574, "Silver"),
            new Car(2014, "Chevrolet Spark LS", 8995, 35304, "Blue"),
            new Car(2013, "Ford Escape 4WD SE", 10900, 70873, "Blue"),
            new Car(2014, "Kia Soul", 10900, 54691, "White"),
            new Car(2013, "Hyundai Tucson AWD", 11900, 72115, "Green"),
            new Car(2018, "Nissan Versa", 11900, 44013, "Red"),
            new Car(2015, "Chevrolet Equinox AWD LS", 11900, 94401, "Silver"),
            new Car(2015, "Kia Sedona LX", 11900, 72751, "Red"),
            new Car(2016, "Hyundai Veloster", 11900, 49369, "White"),
            new Car(2011, "Cadillac DTS Luxury", 12900, 76443, "White"),
            new Car(2014, "Chevrolet Malibu LS w/ PROTECTION PACKAGE", 12900, 28232, "Blue"),
            new Car(2018, "Nissan Sentra", 13900, 37665, "White"),
            new Car(2014, "Subaru Crosstrek 2.0i Premium", 13900, 65360, "Tan"),
            new Car(2017, "Hyundai Elantra Sedan", 13900, 29059, "Blue"),
            new Car(2017, "Hyundai Elantra Sedan w/ CARGO PACKAGE", 14900, 25474, "White"),
            new Car(2016, "Dodge Grand Caravan SXT", 14900, 70812, "Black"),
            new Car(2016, "Jeep Cherokee 4WD Sport", 14900, 73122, "Silver"),
            new Car(2017, "Chevrolet Cruze LT Sedan", 14900, 20560, "Red"),
            new Car(2017, "Hyundai Elantra Sedan", 14900, 24851, "Red"),
            new Car(2014, "Cadillac CTS Sedan w/ SEATING PACKAGE", 14900, 69141, "Black"),
            new Car(2016, "Dodge Grand Caravan SXT", 15495, 70133, "White"),
            new Car(2017, "Nissan Altima", 15900, 14808, "Gray"),
            new Car(2017, "Chevrolet Trax AWD LS", 15900, 21027, "Silver"),
            new Car(2016, "Nissan Rogue AWD w/ SV PREMIUM PACKAGE", 15900, 53087, "Red"),
            new Car(2019, "Chevrolet Sonic LT Sedan w/ RS PACKAGE", 15900, 2928, "White"),
            new Car(2017, "Dodge Grand Caravan SXT", 15900, 68671, "Gray"),
            new Car(2016, "Buick Encore FWD Convenience", 15900, 17734, "Red"),
            new Car(2016, "Buick Encore AWD", 15900, 40059, "Gray"),
            new Car(2008, "Jeep Wrangler 4WD Sahara", 15900, 71164, "Silver"),
            new Car(2016, "Chevrolet Malibu LT", 15900, 42687, "Silver"),
            new Car(2017, "Hyundai Sonata SE", 15900, 30066, "Red"),
            new Car(2017, "Nissan Altima", 15900, 52533, "Gray"),
            new Car(2018, "Ford Focus SE Hatchback", 15900, 8040, "Yellow"),
            new Car(2015, "Honda Civic Si Coupe", 15900, 76904, "Blue"),
            new Car(2013, "Ford Explorer 4WD", 15900, 61089, "Black"),
            new Car(2017, "Nissan Altima", 16495, 30478, "White"),
            new Car(2013, "Cadillac XTS Luxury", 16900, 64693, "Silver"),
            new Car(2017, "Ford Fusion SE", 16900, 29494, "White"),
            new Car(2018, "Nissan Altima", 16900, 36416, "Red"),
            new Car(2019, "Nissan Sentra", 16900, 8749, "Blue"),
            new Car(2016, "Dodge Grand Caravan SE", 16900, 38075, "Red"),
            new Car(2017, "Chevrolet Equinox AWD LS", 16900, 35675, "Black"),
            new Car(2016, "GMC Terrain AWD SLE w/ SLE-1", 16900, 34019, "Red"),
            new Car(2016, "Hyundai Santa Fe AWD Sport w/ OPTION GROUP 03", 17495, 62375, "Blue"),
            new Car(2017, "Chevrolet Equinox AWD LT w/ CONVENIENCE PACKAGE", 17900, 37334, "Silver"),
            new Car(2016, "Buick Encore AWD Premium", 17900, 49013, "White"),
            new Car(2015, "Honda CR-V AWD EX-L", 17900, 73227, "Silver"),
            new Car(2016, "MAZDA CX-3", 17900, 45925, "Blue"),
            new Car(2016, "Hyundai Tucson AWD", 17900, 32063, "Orange"),
            new Car(2015, "Toyota RAV4", 17900, 69173, "Red"));
        }
}

感谢您的帮助

标签: c#asp.net-mvcentity-frameworkasp.net-core

解决方案


解决问题的另一种方法是在您的 HasData 覆盖中,而不是实例化一个新的 Car(它没有显式设置 Id 属性)而是实例化一个匿名对象。然后,您将能够将种子数据的 ID 属性显式设置为您想要的任何正整数或负整数:


            base.OnModelCreating(modelBuilder);


            modelBuilder.Entity<Car>().HasData(
                new { ID = 1, Year = 2013, MakeModel = "Nissan Sentra", Price = 8995, Mileage = 84574, Color = "Silver"}, // and the rest

推荐阅读