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

时间:2015-06-05 08:45:10

标签: c# asp.net-mvc entity-framework entity-framework-4

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();
                        }

我有上面的代码检查某个Region的报告是否不存在,如果它们不存在,我会插入它们。

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

我最好能解决这个问题吗?

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

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

2 个答案:

答案 0 :(得分:0)

我会通过添加一个唯一的索引来解决这个问题,该索引会阻止您为同一个区域插入两个报告。如果没有看到你的模型,很难说它是否应该是主键。

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

答案 1 :(得分:0)

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