【发布时间】:2018-02-19 13:57:35
【问题描述】:
我有一种情况,我在名为 Profile 的表中有一个计数器字段,在提交表单时,我将检索计数器字段并 +1 到计数器并更新配置文件表。递增的计数器将存储在一个变量中,然后我将使用该变量在另一个表 [Bidder] 中创建新记录。问题是当多个表单同时提交时,Bidder表中会产生重复的记录值
Profile profile = db.Profile.Where(w => w.TenderId == tender_Id && w.IsDeleted == false).FirstOrDefault();
int submission = profile.TotalSubmission + 1;
if (profile != null) {
profile.TotalSubmission = submission;
profile.ModifiedBy = user_id;
profile.ModifiedOn = DateTime.Now;
db.Entry(profile).State = EntityState.Modified;
db.SaveChanges();
}
bid.ROId = string.Format("RO{0}", submission);
db.Entry(bid).State = EntityState.Modified;
db.SaveChanges();
如何防止创建重复的 ROId?
【问题讨论】:
-
在列上创建唯一索引。或者更好的是,使用标识列
-
@Rhumborl,到哪个表?简介或投标人?
-
您可以在代码周围加上一个“锁”,这样可以直接解决您的问题,而无需更改太多代码。正如@Rhumborl 所说,我建议通过使用数据库生成密钥(即,如果 SQL Server 是一个标识列)来寻找一种创建唯一 id 的不同方法。
-
@GaryHolland:如果代码在多台机器上运行,锁将不起作用。此外,在同一台机器上,这段代码只能运行一次,而其他线程被锁定。这会产生巨大的性能问题,因为您在锁定期间有整个数据库往返。
-
if (profile != null) {没用。此时,如果profile是null,则会在上一行抛出异常。
标签: c# entity-framework entity-framework-6