EF 更新大量的数据时出现重复键错误

咨询区

  • ChsharpNewbie

当我把大量的数据插入到数据库时 (PostgreSQL 12Entity Framework Core),我得到了如下的报错。

fail: Microsoft.EntityFrameworkCore.Database.Command[20102]Failed executing DbCommand (197ms) [Parameters=[@p0='?', @p1='?', @p2='?' (DbType = DateTimeOffset), @p3='?'], CommandType='Text', CommandTimeout='30']INSERT INTO "FileInfos" ("FileId", "FileName", "LastModifiedDateTime", "Path")VALUES (@p0, @p1, @p2, @p3);
fail: Microsoft.EntityFrameworkCore.Update[10000]An exception occurred in the database while saving changes for context type 'PostgreSQLConnect.ContextModels.WebhookContext'.Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details.---> Npgsql.PostgresException (0x80004005): 23505: duplicate key value violates unique constraint "PK_FileInfos Severity: FEHLERSqlState: 23505MessageText: double key value violates unique constraint »PK_FileInfos«Detail: Detail redacted as it may contain sensitive data. Specify 'Include Error Detail' in the connection string to include this information.SchemaName: publicTableName: FileInfosConstraintName: PK_FileInfosFile: d:\pginstaller_12.auto\postgres.windows-x64\src\backend\access\nbtree\nbtinsert.cLine: 570Routine: _bt_check_unique

这其中一些数据需要被更新,一些数据需要被创建,在一定数据量下这个方法比较稳定,但如果超过阈值后就会抛出如上的错误,我的代码如下:

private async Task SaveFileInfos(FileInfo fileInfo){var foundFileInfo = _context.FileInfos.Where(f => f.FileId == fileInfo.FileId).FirstOrDefault();if (foundFileInfo == null){await _context.FileInfos.AddAsync(fileInfo);}else{foundFileInfo.FileName = fileInfo.FileName;foundFileInfo.LastModifiedDateTime = fileInfo.LastModifiedDateTime;foundFileInfo.Path = fileInfo.Path;}await _context.SaveChangesAsync();}

我的类定义如下:

public class FileInfo : IFileInfo{[Key]public string FileId {get; set;}public string FileName {get; set;}public DateTimeOffset? LastModifiedDateTime {get; set;}public string Path {get; set;}}

Context类如下:

public class WebhookContext : DbContext{public WebhookContext(DbContextOptions<WebhookContext> options) : base(options) { }public DbSet<FileInfo> FileInfos { get; set; }}

然后在 loop 中做数据库保存。

private async Task ConvertAndSaveFiles(IDriveItemDeltaCollectionPage files){ foreach (var file in files){await SaveFileInfos(file.Name, file.Id, file.LastModifiedDateTime, file.ParentReference.Path);}}

请问我这是哪里写的有问题?

回答区

  • Edd

我觉得你要做两点修改。

  1. 将 FirstOrDefault 改成 FirstOrDefaultAsync。

  2. where 查询也是多余的。

改造后如下:

private async Task SaveFileInfos(FileInfo fileInfo){//update your code to use FirstOrDefaultAsyncvar foundFileInfo = await _context.FileInfos.FirstOrDefaultAsync(f => f.FileId == fileInfo.FileId);if (foundFileInfo == null){await _context.FileInfos.AddAsync(fileInfo);}else{foundFileInfo.FileName = fileInfo.FileName;foundFileInfo.LastModifiedDateTime = fileInfo.LastModifiedDateTime;foundFileInfo.Path = fileInfo.Path;}// move this outside the for loop.// this will round trip to Db in EVERY fileInfo, not an optimal solution.await _context.SaveChangesAsync(); }

考虑到 SaveChangesAsync 是序列化到数据库,可以移到循环体外。

private async Task ConvertAndSaveFiles(IDriveItemDeltaCollectionPage files){ foreach (var file in files){await SaveFileInfos(file.Name, file.Id, file.LastModifiedDateTime, file.ParentReference.Path);}// this will save everything to Db in just 1 round tripawait _context.SaveChangesAsync(); }

点评区

我个人感觉,这里报错的原因是: 本应该全异步的写法里面又掺杂了同步的写法,这是一种很鸡肋的做法,数据量稍微大一些之后就会有各种问题,这也是一个好的经验教训。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SharePoint 2010 - 如何导入\导出WebPart

为了保存WebPart并进行重用&#xff0c;有时我们必须导出该WebPart并在其他页面中将其导入。下面是对此过程的描述。 导出一个WebPart 导出一个WebPart可以将WebPart设置保存成计算机本地文件。并不是所有的WebPart都支持这个选项&#xff0c;该页面的所有者可能禁用了这个选项…

OC----内存管理

任何继承了NSObject的对象&#xff0c;都需要内存管理&#xff0c;但是对基本数据类型无效&#xff08;不需要释放&#xff09;原理&#xff1a;每个对象内部都保存了一个与之相关联的整数&#xff0c;称为引用计数器当使用alloc、new或者copy创建一个对象时&#xff0c;对象的…

python赋值语句格式_Python赋值语句后逗号的作用分析

Python赋值语句后逗号的作用分析 本文实例讲述了Python赋值语句后逗号的作用。分享给大家供大家参考。具体分析如下&#xff1a; IDLE 2.6.2 >>> a 1 >>> b 2, >>> print type(a)>>> print type(b)>>> c [] >>> d […

.NET 6 中的 Http Logging 中间件

.NET 6 中的 Http Logging 中间件Intro.NET 6 会引入一个 Http logging 的中间件&#xff0c;可以用来帮助我们比较方便记录请求和响应的信息Sample废话不多说&#xff0c;直接来看示例吧var builder WebApplication.CreateBuilder(args);builder.Services.AddControllers(); …

vue限制点击次数_解决vue 按钮多次点击重复提交数据问题

这个其实是一个很细节的问题。 如果我们操作一个按钮&#xff0c;然后在按钮点击的时候绑定事件。事件分为两种情况&#xff1a;•第一种&#xff1a; 不操作数据型•第二种&#xff1a; 操作数据型 点击 这里我们通过控制isDisable 来设置 disabled来控制按钮的点击和不可点击…

Android 开发学习资源

http://www.verycd.com/topics/2892330/http://www.verycd.com/topics/2900036/转载于:https://www.cnblogs.com/chen110xi/archive/2011/12/06/2277493.html

函数的作用域在各浏览器的混乱情况

if(true) {function someFunc(){return 1;};} else {function someFunc(){return 2;};}var notSomeFunc function someFunc(){return 3;};alert(someFunc());FF输出1&#xff0c;表现为存在“块作用域”。 IE6-IE8输出3&#xff0c;这是它处理命名函数表达式时出现bug&#xf…

2020年高考数学试题难吗?历史上最难数学卷不是2003!

全世界只有3.14 % 的人关注了爆炸吧知识不经历风雨怎能知道明天会死得更惨今天&#xff0c;高考拉开大帷幕&#xff0c;数学考试结束的一瞬间&#xff0c;在微博上简直是一片哀嚎今年&#xff0c;延期一个月高考让许多人预测&#xff0c;难度比起非典那一年或许将有增无减&…

深入浅出Docker(三):Docker开源之路

背景 Docker从一开始的概念阶段就致力于使用开源驱动的方式来发展&#xff0c;它的成功缘于国外成熟的开源文化氛围&#xff0c;以及可借鉴的社区运营经验。通过本文详细的介绍&#xff0c;让大家可以全面了解一个项目亦或者一项技术是如何通过开源的方式发展起来的。为了更准确…

android activity解耦,Android与设计模式:用单一职责原则为Activity解耦

一、什么是单一职责原则单一职责原则(SRP&#xff1a;Single responsibility principle)又称单一功能原则&#xff0c;其定义为&#xff1a;一个类&#xff0c;应该只有一个可以导致变化的原因。光看概念一、什么是单一职责原则单一职责原则(SRP&#xff1a;Single responsibil…

python画图程序没有图_python画图 - v0

学了这么多年python了&#xff0c;还一直没有系统地了解过python的画图功能。 每次都是现学现用&#xff0c;但是某些比较紧急的场合&#xff0c;往往就会比较耗时又耗力&#xff0c;因为不成体系&#xff0c;还经常会忘记已经吸纳的新知识。 所以&#xff0c;我决定把这块的画…

利用Azure communication service实现跟Teams同样等级的沟通协作应用

大家都知道Teams是一个非常强大的沟通协作平台&#xff0c;包括聊天&#xff0c;团队协作&#xff0c;会议&#xff0c;以及应用集成等功能&#xff0c;现在在全世界拥有数以亿计的商业用户。作为Teams平台的一个延伸&#xff0c;产品组把一些核心功能变成了一个公开的服务&…

一个入门的学生选课系统

大三的时候写的一个学生选课系统&#xff0c;WinForm 的使用的SQL数据库。主要有学生&#xff0c;老师两类用户&#xff0c;老师查看选择自己课程的学生&#xff0c;学生进行选课&#xff08;只能选5门课&#xff09;&#xff0c;登陆的时候要有登陆错误次数限制超过会锁定&…

python功能选择模块_python – 组合功能和功能模块

您的compose的实现对于python 3.2是有效的,如上述注释所述.你给出的图书馆的大部分功能都是在documentation中写的python等价物.诸如地图和过滤器的功能已经在python中实现,也可以简单地表示为列表推导. Python有一个id函数返回一个对象的身份(作为整数),但是该库的id函数可以表…

1574: [Usaco2009 Jan]地震损坏Damage

1574: [Usaco2009 Jan]地震损坏Damage Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 425 Solved: 232[Submit][Status][Discuss]Description 农夫John的农场遭受了一场地震.有一些牛棚遭到了损坏,但幸运地,所有牛棚间的路经都还能使用. FJ的农场有P(1 < P < 30,000)…

世界上最诡异的画,到底为何让无数人闻风丧胆?

全世界只有3.14 % 的人关注了爆炸吧知识也许只看到标题 &#xff0c;你一定想不到&#xff0c;传说中世界上最诡异的画是这张。《雨中女郎》这是乌克兰画家斯韦特兰娜捷列茨&#xff0c;绘画生涯中重要的一个作品。也许你会说哪里诡异呢&#xff1f;其实很多人看完这幅画以后&a…

谷歌街景新功能——帮警方抓毒贩

“地球上的毒贩子们&#xff0c;谷歌正在看你们呢。”11月11日的《纽约邮报》在题为《谷歌街景帮忙逮住嫌疑毒贩》的报道开篇这样写道。报道援引执法人员的话说&#xff0c;当时三个毒贩在纽约布鲁克林一处街角向人兜售他们的产品时&#xff0c;被谷歌街景拍个正着。 纽约警介绍…

pixel android8,谷歌Pixel 2更多信息:安卓8.1

给HTC手机团队注入11亿美元现金后&#xff0c;已经显示了谷歌要把硬件做下去的决心&#xff0c;特别是自家的Pixel系列&#xff0c;而10月4日新一代Pixel手机将正式来袭。据Android Police最新报道称&#xff0c;谷歌新的Pixel 2代手机将会提供一个新的功能名叫Always-On Song …

tftp 服务器 ip_360Stack裸金属服务器部署实践

女主宣言裸金属特性是一种将物理设备作为资源提供给租户的云计算服务&#xff0c;租户通过该服务可申请、管理和配置相应的物理设备资源&#xff0c;本文将介绍360Stack裸金属服务器的部署实践。PS&#xff1a;丰富的一线技术、多元化的表现形式&#xff0c;尽在“360云计算”&…

设计模式:状态模式

一、引子 状态模式自身结构非常简单——前面刚刚介绍了几个结构比较简单的设计模式&#xff0c;和他们 一样&#xff0c;状态模式在具体实现上留下了可变换的余地。我前面已经介绍过它的孪生兄妹策略模 式了&#xff0c;大家可以两者比较着阅读。本文将会讨论两者的区别。 二、…