使用实体框架和并发连接时重复记录问题
本文关键字:记录 问题 连接 并发 实体 框架 | 更新日期: 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。