0

最近、SQL Server 2008R2バックエンドを使用してMVC3アプリケーションの作業を開始しました。アプリケーションは、Webクエリからストリーミングデータを受け取り、新しいデータが受信されたときにそのデータをテーブルに挿入します。アプリケーションは、すでに挿入されているデータを受信することがあります(受信したデータには事前生成された主キーが含まれています - このキーはアプリケーションが受信する前に生成されています)すでに存在しているためです。私は自分のプライマリキーを生成することができますが、私はデータベースに重複する行がないようにします。SQL Azure MVC3の主キー違反INSTEAD OFトリガーを使用して

私が考えることができる最も簡単な解決策は、各インサートで発生するテーブルのINSTEAD OFトリガーであり、行が既に存在する場合は挿入を無視します(MVCアプリケーションはチェックする必要はありませんレコードが挿入を試みる前にすでに存在していたかどうかを確認してください)。

これは問題なく動作しましたが、SQL Azureに移植すると、MVCが既に存在する行を挿入しようとするたびに、主キー違反エラーが発生するようになりました。 SSMSでSQL Azureインスタンスに接続して、テーブルに既に存在するキーを使用して挿入を試しても、エラーは表示されないため、トリガーが存在し、機能していることがわかります。

MVCコードでは、データベースから生成したLINQ to SQLクラスと、これらのクラスのInsertOnSubmitメソッドを使用しています。

これはなぜ起こっているのでしょうか?あるいは、私が達成しようとしているものに対して、より良い解決策を提案することができます(LINQなどでこれを行うより良い方法があると確信しています)。私はAzure、LINQ、MVCにはかなり新しいので、どんな提案も歓迎です!

ありがとうございます。

編集:トリガーのコードは以下になりました - と私はAzureのDB上の既存の主キーを使用して、インサートを試してみませんかあれば - 私はこれは私が私の地元のSQL DB上でそれを実行すると正常に動作して言ったように管理スタジオは正常に動作します。このエラーは、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 
+0

トリガーを表示できますか? –

+0

私はその暗黙的な結合を取り除くことから始めたいと思います。ああ。彼らが何かより良いものに取って代わられてから20年後にそれを書くことについて言い訳はありません。それらはSql Antiパターンです。 http://www.amazon.com/gp/product/1934356557/ref=kinw_rke_tl_1 – HLGEM

+0

新しいのはなぜLINQ to SQLを使用していて、EFを使用していないのですか?あなたはEF対L2Sの1000倍の助けを得ることができます。 - SQLプロファイリング/トレースを有効にして、何が起こっているか正確に見ることはできませんか? - これは純粋なSQL Azureの質問です、MVCは無関係です – RickAndMSFT

答えて

0

、私は正確に何をして送信されて表示されるプロファイルです。おそらく、あなたは挿入テーブルに起こっている何を考えて、それが送信した場合、実際に。で何が起こっているかではありません同じであるが現在テーブルにない2つのレコードのバッチでは、このエラーが発生する可能性があります。

+0

私はそれをしました。何が送られているかは、期待されるものです。 SQL2008R2で実行しているときはアプリケーションが正常に動作しますが、Azure DBを指すときにエラーが発生します。 –

関連する問題