0

我最近开始使用SQL Server 2008R2后端开发一个MVC3应用程序。应用程序从Web查询接收流式数据,然后在收到新数据时将数据插入表中。应用程序有时可以接收已插入的数据(正在接收的数据包含预生成的主键 - 在我的应用程序接收到它之前已生成此键),如果不想将此插入到表中因为它已经存在。我意识到我可以生成自己的主键,但是我不想在数据库中有任何重复的行。SQL Azure MVC3主键违例使用INSTEAD OF触发器

我能想到的最简单的解决方案是一个不是在表触发器,在每次插入火灾,并忽略插入如果行已经存在(我的想法是那么的MVC应用程序并不那么需要检查在试图插入之前查看该记录是否已经存在)。

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

在我使用LINQ到我从数据库中,并在这些类的InsertOnSubmit方法生成的SQL类的MVC代码。

有谁知道为什么会发生这种情况?或者建议一个更好的解决方案,我试图实现(我相信有一种更好的方法可以在LINQ中完成)。我对Azure,LINQ和MVC非常陌生,因此欢迎任何建议!

在此先感谢。

编辑:触发代码现在下面 - 正如我所说的,这是工作正常,当我在我的本地SQL数据库上运行它 - 如果我尝试做使用在Azure的数据库已经存在的主键插入管理工作室,它工作正常。该错误仅发生在针对Azure数据库运行的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 
+0

请您介绍一下触发器吗? – 2012-04-04 13:00:31

+0

我会从删除隐式连接开始。啊。在他们被更好的东西取代20年之后,没有任何理由写他们。他们是一个Sql反模式。 http://www.amazon.com/gp/product/1934356557/ref=kinw_rke_tl_1 – HLGEM 2012-04-04 15:47:24

+0

如果你是新手,你为什么使用LINQ to SQL而不是EF?您可以在EF v。L2S上获得1000倍以上的帮助。 - 你不能打开SQL分析/跟踪,看看究竟发生了什么? - 考虑重新命名 - 这是一个纯粹的SQL Azure问题,MVC是无关紧要的 – RickAndMSFT 2012-04-04 17:49:58

回答

0

由于错误只从应用程序发生了,我会个人资料,看看到底是什么在被发送。或许你认为是进入插入表不是什么是真正打算。如果它发送一个一批两个相同但目前不在表中的记录,它可能会得到这个错误。

+0

我已经这样做了 - 正在发送的是预期的内容。在SQL2008R2上运行时,该应用程序工作正常,只有在指向Azure数据库时才会出错。 – 2012-04-04 17:48:20

相关问题