C# 通用存储库插入多条记录

C# 通用存储库插入多条记录,c#,asp.net-mvc,.net-core,C#,Asp.net Mvc,.net Core,我管理了一个通用存储库。当我在表中插入一条记录时,它会工作。若我想上传很多图片并保存它们到数据库的路径,这意味着我可以有1到n条记录,那个么这是一个问题 我遇到错误: SqlException:无法在中插入标识列的显式值 当IDENTITY_INSERT设置为OFF时,表“ItemImages” 只保存第一条记录,其余n条记录不保存到数据库中 这里是存储库类: 公共类存储库:IRepository其中T:BaseEntity { 私有应用程序的bContext\u上下文; 私营DbSet实体;

我管理了一个通用存储库。当我在表中插入一条记录时,它会工作。若我想上传很多图片并保存它们到数据库的路径,这意味着我可以有1到n条记录,那个么这是一个问题

我遇到错误:

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

只保存第一条记录,其余n条记录不保存到数据库中

这里是存储库类:

公共类存储库:IRepository其中T:BaseEntity
{
私有应用程序的bContext\u上下文;
私营DbSet实体;
公共存储库(ApplicationDbContext上下文)
{
_上下文=上下文;
实体=_context.Set();
}
公共作废删除(T实体)
{
if(实体==null)
{
抛出新的ArgumentNullException(“实体”);
}
实体。移除(实体);
}
公共空间处置()
{
_context.Dispose();
}
公共T获取(int id)
{
返回entities.SingleOrDefault(s=>s.Id==Id);
}
公共T Get(表达式谓词)
{
返回实体.Where(谓词).SingleOrDefault();
}
公共T Get(表达式谓词,字符串[]包含)
{
回报包括
.Aggregate(entities.AsQueryable(),(查询,路径)=>query.Include(路径))
.Where(谓词)
.SingleOrDefault();
}
公共IEnumerable GetAll()
{
返回实体。ToList();
}
公共IEnumerable GetAll(字符串[]包括)
{
返回includes.Aggregate(entities.AsQueryable(),(query,path)=>query.includes(path));
}
公共IEnumerable GetAll(表达式谓词)
{
返回实体.Where(谓词).ToList();
}
公共IEnumerable GetAll(表达式谓词,字符串[]包含)
{
回报包括
.Aggregate(entities.AsQueryable(),(查询,路径)=>query.Include(路径))
.Where(谓词)
.ToList();
}
公共无效插入(T实体)
{
if(实体==null)
{
抛出新的ArgumentNullException(“实体”);
}
实体。添加(实体);
}
公共异步任务SaveChangesAsync()
{
返回(wait_context.saveChangesSync()>0);
}
公共无效更新(T实体)
{
实体。更新(实体);
}
下面是我要插入记录的代码:

[HttpPost]
公共异步任务创建([FromForm]ItemImageViewModel viewModel,列表文件)
{
if(ModelState.IsValid)
{
var newItemImage=Mapper.Map(viewModel);
foreach(文件中的var文件)
{
var filePath=Path.Combine(_hostingEnviroment.WebRootPath+“\\images”,file.FileName);
使用(var fileStream=newfilestream(filePath,FileMode.Create))
{
等待file.CopyToAsync(fileStream);
newItemImage.Name=“\\images\\”+file.FileName;
newItemImage.CreateDate=DateTime.Now;
}
_repository.Insert(newItemImage);
wait_repository.saveChangesSync();
}
}
返回操作(“索引”);
}
ItemImage类

公共类ItemImage:BaseEntity
{
[外键(“项目ID”)]
公共虚拟项项{get;set;}
公共int ItemId{get;set;}
}
公共抽象类BaseEntity
{
[关键]
公共int Id{get;set;}
公共日期时间CreateDate{get;set;}
公共日期时间?更新日期{get;set;}
[必需]
[StringLength(255)]
公共字符串名称{get;set;}
[StringLength(4096)]
公共字符串说明{get;set;}
公共字符串用户标识{get;set;}
[外键(“用户ID”)]
公共虚拟应用程序用户应用程序用户{get;set;}
}

因为您在foreach中异步保存数据。将savechange放在的
之后,它将只保存最后一条记录。在插入中放置一个断点,并检查您的实体是否在每次插入调用时都没有覆盖是的,它正在尝试覆盖,但为什么表具有标识?这里的问题是您正在初始化
newItemImage
只在for循环外部保存一次。因此,它将第一次正确保存。在下一次迭代中,它将设置
Id
属性,您只需更改名称并创建数据,然后再次尝试插入它。因为它已经设置了
Id
属性,数据库将抛出此错误。您可能希望将
var newItemImage=Mapper.Map(viewModel);
var filePath…
行之前的循环中。