我的 Razor 3 Web 应用程序正在为同一个外键 Id 创建多行,当多个输入进入同一个 Id 时,我想帮助我避免这种情况。
SQL Server 表将有关记录的数据存储在另一个表中(它是用户对某些事物的评分,其中还有一个用户表和一个可评分事物表,因此评分表具有用户的外键 id,被评级事物的外键 ID 和评级值)。如果未给出评分,则该用户 ID 和事物 ID 没有对应的行。
当用户对某事物进行评分时,代码会调用服务器,服务器会检查该用户之前是否对该事物进行了评分,如果是,则更新该行,如果没有,则创建一个新行:
// Get the member's rating for the thing, or create it.
Member_Thing_Rating memPref = (from mip in _myEntities.Member_Thing_Rating
where mip.thingID == thingId
where mip.MemberID == memberId
select mip).FirstOrDefault();
if (memPref == null)
{
memPref = new Member_Thing_Rating();
memPref.MemberID = memberId;
memPref.thingID = thingId;
_myEntities.Member_Thing_Rating.AddObject(memPref);
}
这工作得很好,除非用户非常快速地为同一件事发送两个评级(这种情况经常发生),这会导致服务器创建两行,因为显然它是多线程的并且两个线程都没有看到现有的行,所以他们都创建一个新的。
那么......我怎样才能避免这种情况呢?
- 我假设我可以以某种方式(?)告诉 SQL Server 做出一个约束,该约束的组合
memberID
应该thingID
在这个表中是唯一的,然后 SQL Server 的工作就是自动解决插入问题,并希望使用最新的值。
或者
- 我想我可以以某种方式(?)告诉这个例程锁定数据库或成为单线程,以便在允许执行对同一例程的下一次调用之前完成添加一行。
我只是不知道要执行的语法或 UI/SQL 步骤,尽管有点看。我认为我更喜欢线程锁解决方案,因为我比 DB 人更喜欢程序员,所以我更喜欢代码的复杂性。
谢谢你的帮助!