SqlException:INSERT 语句与使用 EF 代码优先 C# 的 FOREIGN KEY 约束冲突

Posted

技术标签:

【中文标题】SqlException:INSERT 语句与使用 EF 代码优先 C# 的 FOREIGN KEY 约束冲突【英文标题】:SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint using EF code first C# 【发布时间】:2020-06-30 21:55:57 【问题描述】:

每次单击“添加产品”时都会出现以下错误。我将非常感谢有关我为什么会收到此错误的任何提示

SqlException:INSERT 语句与 FOREIGN KEY 约束“FK_Products_Categories_CategoryId”冲突。冲突发生在数据库“eCommerce”、表“dbo.Categories”、“CategoryId”列中。声明已终止。

主页视图:

                <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                    <ul class="nav navbar-nav">
    <li><a asp-controller="Home" asp-action="Index">Home</a></li>

    <li><a asp-controller="Product" asp-action="AddProduct">Add product</a></li>
    enter code here
                     </ul>
                </div>

AppDbContext.cs

    public class AppDbContext : IdentityDbContext<IdentityUser>
    
        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
        

        
        public DbSet<Category> Categories  get; set; 
        public DbSet<Product> Products  get; set; 
    

我的模型: Product.cs 和 Category.cs 模型:

  public class Product
    
        public int ProductId  get; set;                 
        public string Name  get; set; 
        public string ShortDescription  get; set; 
        public string LongDescription  get; set; 
        public decimal Price  get; set; 
        public string ImageUrl  get; set; 
        public string ImageThumbnailUrl  get; set; 
        public bool IsProductOfTheWeek  get; set; 
        public bool InStock  get; set; 
        public int CategoryId  get; set; 
        public Category Category  get; set; 
    

    public class Category
    
        public int CategoryId  get; set; 
        public string CategoryName  get; set; 
        public string Description  get; set; 
        public List<Product> Products  get; set; 
    

我的控制器:Productontroller.cs

        [HttpPost]
        public IActionResult AddProduct(Product product)
        
            if (ModelState.IsValid)
            
                _appDbContext.Products.Add(product);  
                _appDbContext.SaveChanges();            
                return RedirectToAction("SeedComplete");
            

            return View(product);
        


        public IActionResult SeedComplete()
        
            ViewBag.SeedCompleteMessage = "Thanks for adding the product!";

            return View();
        

我的看法: AddProduct.cshtml

@model Product

    <form asp-action="AddProduct" method="post" class="form-horizontal" role="form">
        <h4>You're just one step away.</h4>

        <div asp-validation-summary="All" class="text-danger"></div>

        <div class="form-group">
            <label asp-for="Name" class="col-md-2 control-label"></label>
            <div class="col-md-5">
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>
        </div>

        <div class="form-group">
            <label asp-for="Price" class="col-md-2 control-label"></label>
            <div class="col-md-5">
                <input asp-for="Price" class="form-control" />
                <span asp-validation-for="Price" class="text-danger"></span>
            </div>
        </div>

        <div class="form-group">
            <label asp-for="ShortDescription" class="col-md-2 control-label"></label>
            <div class="col-md-5">
                <input asp-for="ShortDescription" class="form-control" />
                <span asp-validation-for="ShortDescription" class="text-danger"></span>
            </div>
        </div>

        <div class="form-group">
            <label asp-for="LongDescription" class="col-md-2 control-label"></label>
            <div class="col-md-5">
                <input asp-for="LongDescription" class="form-control" />
                <span asp-validation-for="LongDescription" class="text-danger"></span>
            </div>
        </div>

        <div class="form-group">
            <label asp-for="ImageUrl" class="col-md-2 control-label"></label>
            <div class="col-md-5">
                <input asp-for="ImageUrl" class="form-control" />
                <span asp-validation-for="ImageUrl" class="text-danger"></span>
            </div>
        </div>

        <div class="form-group">
            <label asp-for="ImageThumbnailUrl" class="col-md-2 control-label"></label>
            <div class="col-md-5">
                <input asp-for="ImageThumbnailUrl" class="form-control" />
                <span asp-validation-for="ImageThumbnailUrl" class="text-danger"></span>
            </div>
        </div>

        <div class="form-group">
            <label asp-for="IsProductOfTheWeek" class="col-md-2 control-label"></label>
            <div class="col-md-5">
                <input asp-for="IsProductOfTheWeek" class="form-control" />
                <span asp-validation-for="IsProductOfTheWeek" class="text-danger"></span>
            </div>
        </div>

        <div class="form-group">
            <label asp-for="InStock" class="col-md-2 control-label"></label>
            <div class="col-md-5">
                <input asp-for="InStock" class="form-control" />
                <span asp-validation-for="InStock" class="text-danger"></span>
            </div>
        </div>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-5">
                <input id="btn" type="submit" class="btn btn-primary" value="Complete the seed" />
            </div>
        </div>

    </form>

SeedComplete.cshtml:

<h1>@ViewBag.SeedCompleteMessage </h1>

【问题讨论】:

显示您的 productRepository 代码,可能还有您的 EF 映射代码。其余的可能不需要。 检查 INSERT 语句。我敢打赌它会尝试插入 CategoryId = 0 的产品。 【参考方案1】:

我在 cshtml 中看不到您将设置 CategoryId,这意味着它可能会设置为 0,这会导致外键约束违规。

在你的控制器代码的这一行设置断点:

_appDbContext.Products.Add(product); 

并查看 CategoryId 是否为 0。

【讨论】:

你说的是零广告。我已将 CategoryId 添加到视图中,但它仍然为零 显示新的视图代码?但实际上,您需要弄清楚为什么没有发送 categoryId。检查您通过浏览器发送的数据——如果您不知道如何执行此操作,请查看此问题:***.com/questions/15603561/…。 感谢您的帮助。如您所说,问题出在视图中。未发送 categoryId。

以上是关于SqlException:INSERT 语句与使用 EF 代码优先 C# 的 FOREIGN KEY 约束冲突的主要内容,如果未能解决你的问题,请参考以下文章

mybatis之insert语句报错Cause: java.sql.SQLException: sql injection violation, syntax error: ERROR. token

SQLException : 字符串或二进制数据将被截断

JDBC Insert语句插入Oracle数据库返回数据主键

Spring Batch 无法获取 last_insert_id();嵌套异常是 java.sql.SQLException: Lock wait timeout exceeded;

SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“任务”中插入标识列的显式值

ASP.NET MVC 错误 SqlException:当 IDENTITY_INSERT 设置为 OFF 时,无法在表“用户”中插入标识列的显式值