Почему EF Core не генерирует поле id автоматически? - PullRequest
0 голосов
/ 26 сентября 2019

Я новичок в программировании и разработке, и я учусь, и это один из моих учебных проектов.Я пытался обойти это различными способами, но когда я пытаюсь добавить новую модель транспортного средства в конкретную марку транспортного средства, столбец Id не увеличивается автоматически, а пытается перезаписать первый Id.

Я попытался обойти аннотации данных, которые, на мой взгляд, являются правильными, я попытался вручную добавить значения в базу данных с помощью запросов, и это прекрасно работает.Пробовал удалять БД и миграции, снова менять аннотации и ничего не работает.Единственное, что я могу сделать неправильно, это сам код, вероятно, где-то на уровне контроллера или сервиса.

Класс VehicleMake:

public class VehicleMake
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        [Required]
        [Display(Name = "Make Name")]
        public string Name { get; set; }
        [Required]
        [Display(Name = "Abbreviation")]
        public string Abrv { get; set; }
        [Display(Name = "Models")]
        public virtual IEnumerable<VehicleModel> VehicleModels { get; set; }
    }

Класс VehicleModel:

public class VehicleModel
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        [Required]
        public int MakeId { get; set; }
        public virtual VehicleMake Make { get; set; }
        [Required]
        [Display(Name = "Model Name")]
        public string Name { get; set; }
        [Required]
        [Display(Name="Abbreviation")]
        public string Abrv { get; set; }
    }

Контроллер для модели автомобиля:

[HttpPost]
        public IActionResult Create(int Id, VehicleModel newModel)
        {
            if (ModelState.IsValid)
            {
                newModel.MakeId = Id;
                _model.Add(newModel);
                return RedirectToAction("Index");
            }
            return View(newModel);
        }

Служба добавления новой модели:

public void Add(VehicleModel newModel)
        {
            _context.Add(newModel);
            _context.SaveChanges();
        }

Вот значение, которое оно пытается добавить в БД и, конечно, выдает ошибку https://imgur.com/pL9EruF

Что я делаю не так?

1 Ответ

0 голосов
/ 26 сентября 2019

Почему вы сначала передаете идентификатор для действия создания?Вы должны просто иметь:

    [HttpPost]
    public async Task<IActionResult> Create(VehicleModel newModel)
    {
        if (!ModelState.IsValid)
            return View(newModel);

        _context.Add(newModel);
        await _context.SaveChangesAsync();

        return RedirectToAction("Index");
    }

Примечание:

  1. Я показываю здесь минимальный код.Если вы хотите отделить вызов к Add и SaveChangesAsync к службе, это нормально.
  2. Используйте асинхронные методы при работе с EF Core.ASP.NET Core и EF Core полностью асинхронны.Методы синхронизации существуют только для обслуживания редких сценариев, когда по какой-то причине вы не можете использовать асинхронный доступ, и все, что они делают, это блокируют асинхронные методы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...