ASP.NET MVC 5 插入语句冲突 FK

Posted

技术标签:

【中文标题】ASP.NET MVC 5 插入语句冲突 FK【英文标题】:ASP.NET MVC 5 Insert statement conflict FK 【发布时间】:2021-06-11 19:24:24 【问题描述】:

我构建一个简单的项目只是为了自学,我有一个小问题。 我正在使用 Visual Studio 和实体框架。

我构建了一个 ASP.NET MVC 5 应用程序,其中包含 CRUD 功能。 在数据库中是 2 个表之间的连接,例如 on screenshot

来自 CarController 的 HTTP POST 波纹管

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Save(Car car)
        

            if (!ModelState.IsValid)
            
                var viewModel = new CarFormViewModel()
                
                    Cars = car,
                    CarTypeModels = _context.CarTypeModels.ToList()
                ;
                return View("CarForm", viewModel);
            


            if (car.Id == 0)
                _context.Cars.Add(car);
            else
            
                var customerInDb = _context.Cars.Single(c => c.Id == car.Id);
                customerInDb.Name = car.Name;
                customerInDb.HorsePower = car.HorsePower;
                customerInDb.LinkToImage = car.LinkToImage;
                customerInDb.CarTypeModelId = car.CarTypeModelId;
            

            _context.SaveChanges();

            return RedirectToAction("Index", "Car");
        

我收到一个错误error

Db.CarTypeModel ->

CREATE TABLE [dbo].[CarTypeModels] (
[Id]   TINYINT        NOT NULL,
[Name] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_dbo.CarTypeModels] PRIMARY KEY CLUSTERED ([Id] ASC));

db.Car ->

 CREATE TABLE [dbo].[Cars] (
[Id]             INT            IDENTITY (1, 1) NOT NULL,
[Name]           NVARCHAR (255) NULL,
[HorsePower]     INT            NOT NULL,
[LinkToImage]    NVARCHAR (MAX) NULL,
[CarTypeModelId] TINYINT        DEFAULT ((0)) NOT NULL,
CONSTRAINT [PK_dbo.Cars] PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_dbo.Cars_dbo.CarTypeModels_CarTypeModelId] FOREIGN KEY ([CarTypeModelId]) REFERENCES [dbo].[CarTypeModels] ([Id]) ON DELETE CASCADE); GO CREATE NONCLUSTERED INDEX [IX_CarTypeModelId] ON [dbo].[Cars]([CarTypeModelId] ASC);

以及使用 CarTypeModelId 的 CarForm 代码

<div class="form-group">
    @html.LabelFor(m => m.Cars.CarTypeModelId)
    @Html.DropDownListFor(m => m.Cars.CarTypeModelId, new SelectList(Model.CarTypeModels, "ID", "Name"), "Select car type", new  @class = "form-control" )
    @Html.ValidationMessageFor(m => m.Cars.CarTypeModelId)
</div>

我有 API 连接并且它工作正常。我认为问题出在 CarController 但我真的不知道在哪里......

//POST /api/cars
    [HttpPost]
    public IHttpActionResult CreateCar(CarDto carDto)
    
        if (!ModelState.IsValid)
        
            return BadRequest();
        
        var car = Mapper.Map<CarDto, Car>(carDto);
        _context.Cars.Add(car);
        _context.SaveChanges();

        carDto.Id = car.Id;

        return Created(new Uri(Request.RequestUri + "/" + car.Id), carDto);
    

【问题讨论】:

【参考方案1】:

我认为您的下拉列表选择无法正常工作并返回 car.CarTypeModelId= 0。尝试通过将“ID”替换为“Id”来修复下拉列表:


 @Html.DropDownListFor(m => m.Cars.CarTypeModelId, new SelectList(Model.CarTypeModels, "Id", "Name"), "Select car type", new  @class = "form-control" )

【讨论】:

我试过这个,不是这个,但我找到了解决方案。在我在保存功能中使用的 CarFormView 中,小错误。在 DB 中,我有表名 Car 和 CarFormView。公共类 CarFormViewModel public IEnumerable CarTypeModels get;set; public Car Cars get;放; 我将 Cars 重命名为 Car 并解决了我的问题。

以上是关于ASP.NET MVC 5 插入语句冲突 FK的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历 MultiSelectList 发布的值并将每个值插入 ASP.Net MVC 5 中的新数据库行?

Asp.net core Identity “INSERT 语句与 FOREIGN KEY 约束冲突”

SqlException:INSERT 语句与 FOREIGN KEY 约束冲突 - asp.net-core

使用 jQuery 和 ASP.NET MVC 将集合插入模型,创建插件

如何在asp.net mvc中使用dropdownlist在数据库中插入记录?

如何确定在 C# ASP.NET CORE MVC 5.0 中选择了哪个单选按钮