使用实体框架和并发连接时重复记录问题

本文关键字:记录 问题 连接 并发 实体 框架 | 更新日期: 2023-09-27 17:53:26

var DoesNotExist = this.db.Regions.Where(!m.Reports.Any(r => r.ReportId == m.ReportId)).ToList();
foreach (var item in DoesNotExist)
                        {
                            Report rpt = new Report { ReportId = item.ReportId, ReportDate = endDate };
                            this.db.Reports.AddObject(rpt);
                            foreach (var Point in this.db.RegionalData.Where(s => s.ReportId == item.ReportId && s.ReportDate == lastendDate))
                            {
                                if (this.db.RegionalData.Where(d => d.ReportId == Point.ReportId).Count() == 0)
                                {
                                    StateData sd = new StateData
                                    {
                                        ReportDate = endDate,
                                        ReportId = Point.ReportId,
                                        Female = Point.Female,
                                        Male = Point.Male,
                                        Total = Point.Total,
                                       };
                                    this.db.RegionalData.AddObject(sd);
                                }
                            }
                        }
                        if (DoesNotExist.Count() != 0)
                        {
                            this.db.SaveChanges();
                        }

我有上面的代码检查报告是否为一个地区不存在,如果他们不存在,我插入他们。

我遇到的问题是,如果两个用户相隔几秒钟触发执行这段代码,则创建同一区域的两个报告,这会创建重复,因为一个区域只能有一个报告。

我怎样才能最好地解决这个问题?

我试着打推杆if (missingReportData.Count() != 0) { this.db.SaveChanges(); }

紧跟在this.db.Reports.AddObject(rpt);之后,但问题仍然存在。

使用实体框架和并发连接时重复记录问题

我将通过添加唯一索引来解决这个问题,该索引可以防止您为同一地区插入两个报告。在没有看到模型的情况下,很难说它是否应该是主键。

这样,如果已经有该区域的报告,数据库服务器将抛出异常。然后您可以通过切换到更新或向用户显示错误来处理该异常。

您也可以使用事务,但您需要将EF4更新为EF6。