You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET MVC中IDENTITY_INSERT错误及数据库种子数据不显示问题排查

问题分析与解决方案

核心错误修复:IDENTITY_INSERT 报错

错误原因

SQL Server中,Products和Categories表的ProductId、CategoryId是自增标识列(IDENTITY),默认不允许手动插入显式值。你在种子数据中直接指定了ProductId=1、CategoryId=1这类固定值,触发了Cannot insert explicit value for identity column...错误。

修复方案

方案1:移除手动ID赋值(推荐)

删除种子数据中所有手动指定的ProductId和CategoryId,让数据库自动生成自增ID:

// 修改AppDbInitializer.cs中的Product对象
new Product()
{
    // 移除 ProductId=1,
    ProductName="Kiraz Çiçeği Sallantılı Charm",
    Image="~/img/flower.jpg",
    Price=(int)2.519,
    Description="925 ayar gümüşten üretilen...",
    Characteristics="Doğa ve Gökyüzü temalıdır..."
}

// Category对象同理,移除CategoryId赋值
new Category()
{
    // 移除 CategoryId=1,
    CategoryName="Charm'lar"
}

方案2:手动开启IDENTITY_INSERT(仅需指定固定ID时使用)

如果必须手动设置ID,需要在插入数据前后执行SQL开启/关闭标识插入:

// 插入Products前开启
context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Products ON");
context.Products.AddRange(/* 你的Product列表 */);
context.SaveChanges();
context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Products OFF");

// 插入Categories同理
context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Categories ON");
context.Categories.AddRange(/* 你的Category列表 */);
context.SaveChanges();
context.Database.ExecuteSqlRaw("SET IDENTITY_INSERT Categories OFF");

数据未显示的额外问题修复

1. 视图图片路径错误

你的View中,图片标签的src错误使用了@item.ProductName(产品名称),应该替换为@item.Image(图片路径),同时修正alt属性为产品名称:

<td class="align-middle">
    <img class="rounded-circle" src="@item.Image" alt="@item.ProductName" style="max-width: 150px" />
</td>

2. 避免重复插入种子数据

在Seed方法中添加判断,仅当表中无数据时才执行插入,防止每次启动应用重复插入:

public static void Seed(IApplicationBuilder applicationBuilder)
{
    using (var serviceScope = applicationBuilder.ApplicationServices.CreateScope())
    {
        var context = serviceScope.ServiceProvider.GetService<DataContext>();
        context.Database.EnsureCreated();

        // 仅当Products为空时插入
        if (!context.Products.Any())
        {
            context.Products.AddRange(/* Product列表 */);
            context.SaveChanges();
        }

        // 仅当Categories为空时插入
        if (!context.Categories.Any())
        {
            context.Categories.AddRange(/* Category列表 */);
            context.SaveChanges();
        }
    }
}

关于未使用类的说明

DataContext中存在大量未使用的DbSet(如Accounts、Addresses等),这些不会直接导致当前错误,但会增加数据库迁移的复杂度。建议仅保留当前项目需要的DbSet,不需要的及时清理,避免后续维护混淆。


内容的提问来源于stack exchange,提问作者Büşra Nur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:05:53