2011-07-12 20 views
1

キー(LocumID) - 値(AvailableDate)を保持するテーブルがあります。テーブルにはそれ自身のプライマーがあります。キー/値を繰り返すことはできませんので、LocumID & AvailableDateに一意の複合制約を追加しました。Linq-2-SQLコンテキストのSQLクエリの優先順位

OID     LocumID    AvailableDate   AvailabilityStatusID 
-------------------- -------------------- ----------------------- -------------------- 
1     1     2009-03-02 00:00:00  1      
2     2     2009-03-04 00:00:00  1      
3     1     2009-03-05 00:00:00  1      
4     1     2009-03-06 00:00:00  1      
5     2     2009-03-07 00:00:00  1      
6     7     2009-03-09 00:00:00  1      
7     1     2009-03-11 00:00:00  1      
8     1     2009-03-12 00:00:00  2      
9     1     2009-03-14 00:00:00  1      
10     1     2009-03-16 00:00:00  1      

は今、本当の使用時に、私は単にLocumID-AvailableDateペアの古い値(複数可)を排除し、新しいものを挿入することは最善のアプローチであることがわかります。しかしLinq-to-SQLでは、最後にDbContext.SubmitChanges()を呼び出しています。これは、SQL Serverがその文が制約と競合していると不平を言って例外をスローする場所です。

私は自分のコードラインをチェックすると、まず既存のペアを削除して、新しいものを作成して挿入します。このトランザクションで制約が違反しているのはなぜですか?

また、既存のペアを最初に削除した場合は、SubmitChangesを作成してから新しいペアを作成して挿入してください。SubmitChanges ...すべてがうまくいきます。

しかし、私は完全なトランザクションの利点を失います。

アイデア?よろしく。

+0

問題のSQLを表示できるようにDataContextに.Logプロパティを設定しましたか?それも同様に投稿するのに役立つかもしれません。 – mattmc3

+0

正確なエラーはどうですか? – gbn

+0

私はなぜそれらの質問をしているのか分かりません。問題は明らかです:Linq2Sqlは、削除の前に挿入を実行します。 –

答えて

2

SubmitChangesは、この順番で呼び出しを行う必要はありません。しかし、代わりにトランザクションを作るためにLINQ to SQLはに依存するのは、単に1を自分で作る:それは、独自のものを作る前にトランザクションを見つけた場合、SQLへ

using(TransactionScope scope = new TransactionScope()) 
{ 
    //first call 
    context.SubmitChanges(); 

    //other work 
    context.SubmitChanges(); 
} 

LINQは、最初にチェックします。

+0

さて、私は今、この例外を取得しています: '分散トランザクションマネージャ(MSDTC)のネットワークアクセスが無効になっています。コンポーネントサービスの管理ツールを使用して、MSDTCのセキュリティ設定でネットワークアクセスのためにDTCを有効にしてください。スコープ変数...これをフラッシュ/閉じる/処理する必要があります。 – DoomerDGR8

+0

using(私の最後の呼び出し)の閉じる括弧の直前に 'scope.Complete()'を追加しました。参照してください...ノーオペレーション:新しい例外: '現在のTransactionScopeは既に完了しました。 DBContextに、さらにCRUD操作のためにTransactionScopeを忘れるように指示するにはどうすればよいですか?私のカスタムスコープを放棄していないようです... – DoomerDGR8

+0

私のコンテキストは '静的'でした** DUH **。それは処分されていないので、取引に固執していました。問題が解決しました。ありがとう! – DoomerDGR8

関連する問題