2010-12-30 18 views
1

N-TierデザインにSqlにLinqを収めようとしています。私はデータコンテキストにオブジェクトを付加するときに元の値を供給して並行性を実装しています。 SubmitChangesを呼び出して、SQL Serverプロファイラで生成されたスクリプトを観察すると、それらが正しく生成されていることがわかります。これらは、すべてのオブジェクトのプロパティをチェックするwhere節(UpdateCheck.Alwaysですべてがマークされています)を含みます。Linq to Sql:スローされないChangeConflictException

結果は期待どおりです。つまり、更新時に行が更新されたり、削除時に削除されたりする行はありません。しかし、私は何の例外もありません。これはChangeConflictExceptionをスローするはずですか?

私は実行しているテストの設計とフローを分かりやすくするために、WsHttpBindingを使用してWCF経由でお互いに話すクライアントコンソールとサービスコンソールがあります。

  1. クライアントは
  2. サービスは、DataContextのをインスタンス化するデータを取得し、コンテキストを破棄し、クライアントにデータを返すサービスからのデータを要求します。
  3. クライアントは返されたデータを変更します。
  4. クライアントは、変更されたデータの更新をサービスから要求します。
    5a。サービスはデータコンテキストをインスタンス化し、オブジェクトを接続します。
    5b。私は変更を競合させるために、実行を一時停止し、データベース内の値を変更します。
    5c SubmitChangesサービスコール。あなたが見ることができるように、

    public void UpdateEntities(ReadOnlyChangeSet<Entity> changeSet) 
         { 
          using (EntityDataContext context = new EntityDataContext()) 
          { 
           if (changeSet.AddedEntities.Count > 0) 
           { 
            context.Entities.InsertAllOnSubmit(changeSet.AddedEntities); 
           } 
    
           if (changeSet.RemovedEntities.Count > 0) 
           { 
            context.Entities.AttachAll(changeSet.RemovedEntities, false); 
            context.Entities.DeleteAllOnSubmit(changeSet.RemovedEntities); 
           } 
    
           if (changeSet.ModifiedRecords.Count > 0) 
           { 
            foreach (var record in changeSet.ModifiedRecords) 
            { 
             context.Entities.Attach(record.Current, record.Original); 
            } 
           } 
    
           // This is where I pause execution and make changes to the database 
    
           context.SubmitChanges(); 
          } 
         } 
    

    私は原稿を変更を追跡し、維持するために、いくつかのクラスを使用しています:

は、ここで明確にするためビットをクリーンアップステップ5のコード、です。

助けてください。

EDIT:挿入に問題はありません。私は完全性のためにInsertAllOnSubmitを呼び出すコードだけを含んでいます。

答えて

0

私は答えを見つけました。 Linq To Sql(私が間違っている場合は私を修正する)のバグのようです。データベース内で更新されているテーブルにトリガがあることが分かります。このトリガーは、戻り値を持つストアドプロシージャを呼び出します。これにより、このテーブルに対して挿入、更新、または削除を行う呼び出しが行われ、行数ではなく数値である戻り値(トリガーによって実行されるストアドプロシージャから)が生成されます。明らかにL2Sはこの数を見て、挿入/更新/削除が実際には起こっていないのにすべてがうまくいったと仮定します。

特に、返された数値に定義された列名があり、その値が6桁の領域にあることを考えると、これは非常に奇妙です。