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
相关产品推荐
相关产品推荐

