C# 为什么';EF核心自动生成id字段?

C# 为什么';EF核心自动生成id字段?,c#,asp.net-core-mvc,entity-framework-core,C#,Asp.net Core Mvc,Entity Framework Core,我是编程和开发新手,我正在学习,这是我的学习项目之一。我一直试图以各种方式解决这个问题,但当我尝试将新车型添加到特定的车辆品牌时,Id列不会自动递增,而是尝试覆盖第一个Id 我试着处理数据注释,我认为这是正确的,我试着通过查询向数据库手动添加值,它工作得非常好。尝试删除数据库和迁移,再次更改注释,但没有任何效果。我唯一可能出错的就是代码本身,可能是在控制器或服务层的某个地方 车辆品牌等级: public class VehicleMake { [Key]

我是编程和开发新手,我正在学习,这是我的学习项目之一。我一直试图以各种方式解决这个问题,但当我尝试将新车型添加到特定的车辆品牌时,Id列不会自动递增,而是尝试覆盖第一个Id

我试着处理数据注释,我认为这是正确的,我试着通过查询向数据库手动添加值,它工作得非常好。尝试删除数据库和迁移,再次更改注释,但没有任何效果。我唯一可能出错的就是代码本身,可能是在控制器或服务层的某个地方

车辆品牌等级:

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; }
    }
车型控制器:

[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();
        }
下面是它试图添加到db中的值,当然给出了一个错误


我做错了什么?

首先为什么要将id传递给创建操作?你应该有:

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

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

        return RedirectToAction("Index");
    }
[HttpPost]
公共异步任务创建(车辆模型newModel)
{
如果(!ModelState.IsValid)
返回视图(新模型);
_Add(newModel);
wait_context.SaveChangesAsync();
返回操作(“索引”);
}
注:

  • 我在这里展示最小的代码。如果您想将对
    Add
    savechangesync
    的调用分解到服务中,这很好
  • 使用EF Core时使用异步方法。ASP.NET核心和EF核心始终是异步的。sync方法只适用于少数情况下由于某种原因不能使用async的情况,它们所做的只是阻塞async方法

  • 在创建时,您不应传递id,它的默认值应为0,也不应传递db实体/模型作为viewModel,不要按顺序设置id,它将工作……对于id,我在这里传递模型的make id,因为它无法识别我为哪个品牌添加模型。至于异步方法,我将实现它们,谢谢你。你仍然不需要这样做。在你的模型上。直接绑定到
    MakeId
        [HttpPost]
        public async Task<IActionResult> Create(VehicleModel newModel)
        {
            if (!ModelState.IsValid)
                return View(newModel);
    
            _context.Add(newModel);
            await _context.SaveChangesAsync();
    
            return RedirectToAction("Index");
        }