1

我的Razor 3 Web应用程序正在为同一个外键ID创建多行,当多个输入进来的同一个ID,我想如何避免这种情况的帮助。如何避免来自近乎同步的SQL添加的重复行?

SQL Server表存储有关另一个表中的记录的数据(它是用户给出的关于某些事情的评分,其中还有一个用户表和一个可评价事物的表,因此评级表具有一个外键用户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); 
} 

,当用户发送两个级别同样的事情非常快(这恰好相当频繁),这会导致服务器创建两个行EXCEPT工作得很好,因为很明显它是多线程的,既不线程看到的现有的行,所以他们都创建一个新的。

所以...我该如何避免这种情况?

  • 我想我能以某种方式(?)告诉SQL Server做出的memberIDthingID连击应该是唯一在该表的约束,然后这将是SQL Server的工作,自动神奇地化解插入和希望使用最新的价值。

  • 我想我能以某种方式(?)告诉这个程序锁定DB或成为单线程所以相同的程序允许一个完成的下次调用之前添加行执行。

我只是不知道要做的语法或UI/SQL步骤,尽管有点看。我认为我更喜欢线程锁解决方案,因为我比DB人更像程序员,所以我更喜欢我的代码复杂性。

感谢您的帮助!

回答

2

你可以唯一约束很容易地添加到您的SQL Server表,以确保你永远不会在你的(memberID, thingID)列得到重复:现在

ALTER TABLE dbo.YourTableNameHere 
ADD CONSTRAINT UQ_MemberID_ThingID UNIQUE(MemberID, ThingID) 

,如果你的第二个连接试图插入一行与值(MemberID, ThingID)已经在表格中,INSERT将失败,您会收到一个您可以处理的异常,例如为这些ID中的一个或两个获取新值。

+0

好吧,我一直在努力让异常处理程序工作。我现在遇到的问题是,即使我有我的异常处理程序执行我想要的操作,但当我再次执行SaveChanges时,显然违反约束的add仍然存在,我不知道如何将其退出。任何人都知道删除违规添加的语法,所以我可以继续? – Dronz