Изменение моего класса так, чтобы идентификатор автоматически увеличивался: Entity Framework - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь создать базу данных с использованием Entity Framework, но когда я запускаю команду add-migration initial в консоли диспетчера пакетов nuget, я получаю эту ошибку:

Начальный объект для типа объекта ' Car 'не может быть добавлен, потому что для свойства' 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"));
        }
}

Спасибо за вашу помощь

Ответы [ 3 ]

1 голос
/ 12 апреля 2020

Другим способом решения этой проблемы было бы переопределение 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
0 голосов
/ 12 апреля 2020

Вы можете попытаться добавить отдельное отрицательное значение для каждого идентификатора для каждого элемента, который вы вставляете в начале. Как -1, -2, -3.

Вы можете использовать Guid вместо int для ID. Вы можете использовать Guid.NewGuid(); в конструкторе для установки нового идентификатора.

0 голосов
/ 12 апреля 2020

вы можете удалить [key] и [DatabaseGenerated], тогда сущность-фреймворк автоматически установит ID как Key

...