SQL Azure MVC3主键冲突使用INSTEAD OF触发器

时间:2012-04-04 12:44:37

标签: sql-server asp.net-mvc asp.net-mvc-3 linq-to-sql azure-sql-database

我最近开始使用SQL Server 2008R2后端开发MVC3应用程序。应用程序从Web查询接收流数据,然后在接收到新数据时将数据插入表中。应用程序有时可以接收已插入的数据(正在接收的数据包括预先生成的主键 - 此密钥已在我的应用程序接收之前生成),如果这样我不想将其插入表中因为它已经存在。我意识到我可以生成自己的主键,但是我不希望数据库中有任何重复的行。

我能想到的最简单的解决方案是桌面上的INSTEAD OF触发器会触发每个插入,然后如果行已经存在则忽略插入(我的想法是那时MVC应用程序不需要检查以查看记录在尝试插入之前是否已经存在)。

这工作正常,但是当我将它移植到SQL Azure时,每次MVC尝试插入已存在的行时,我现在都会收到主键冲突错误 - 就像触发器无法正常工作一样。如果我连接到SSMS中的SQL Azure实例并尝试使用表中已存在的密钥执行插入操作,则不会收到任何错误,因此我知道触发器存在且正常运行。

在MVC代码中,我使用的是从数据库生成的LINQ to SQL类,以及这些类上的InsertOnSubmit方法。

有谁知道为什么会这样?或者为我想要实现的目标建议一个更好的解决方案(我确信在LINQ或其他方面可能有更好的方法)。我是Azure,LINQ和MVC的新手,所以欢迎任何建议!

提前致谢。

编辑:触发代码现在位于下方 - 正如我所说,当我在本地SQL数据库上运行它时工作正常 - 如果我尝试使用已存在的主键执行插入操作管理工作室中的Azure数据库工作正常。该错误仅发生在针对Azure DB运行的MVC应用程序中。

CREATE TRIGGER [dbo].[IO_Trig_INS_User] ON [dbo].[STRM_User]
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON
--Check for existing user. If there is no duplicate, do an insert.
IF (NOT EXISTS (SELECT P.UserId
      FROM dbo.STRM_User P, inserted I
      WHERE P.UserId = I.UserId))
   INSERT INTO dbo.STRM_User
      SELECT *
      FROM inserted
END
GO

1 个答案:

答案 0 :(得分:0)

由于错误只发生在应用程序中,我会查看确切的内容。或许您认为进入插入表的内容并不是实际发生的内容。如果它发送了一批两个记录它们是相同但目前不在表中,它可能会出现此错误。