0

さて、私は次の行からこのエラーを受け取っています:

  System.Data.Linq.DataContext.CheckNotInSubmitChanges() +42
  System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +54

私が行っているのは、アプリケーションの状態を追跡し、各リクエストをログに記録することです。アプリは、Json、Xml、およびHtmlで出力をレンダリングします。

問題は、エラーが不安定であるということです。いくつかのリクエストごとにのみ発生します。Ajaxリクエストを開始すると、エラーが発生し始めました。迅速なリクエスト(つまり、リンクを繰り返しクリックした場合)で、エラーがより頻繁に発生することを確認できました。

エラーをスローしているサービスを呼び出すたびに、DataContextの個別のインスタンスを作成しています。ここで何が問題なのかを理解するのに非常に苦労しています。何が起こっているのかについてのガイダンスや説明をいただければ幸いです。ありがとうございました。

* 編集 : **

 [InvalidOperationException: The operation cannot be performed during a call to SubmitChanges.]
    System.Data.Linq.DataContext.CheckNotInSubmitChanges() +80
    System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) +73
    Magic.Model.Sessions.SqlXmlSessionStore.SubmitChanges() in SqlXmlSessionStore.cs:17
    Magic.Model.Sessions.SqlXmlSessionStore.UpdateSession(Session session) in SqlXmlSessionStore.cs:64
    Magic.Web.SessionService.OpenSession(MagicRequestContext requestContext) in SessionService.cs:36
    Magic.Web.SessionService.Magic.Model.Sessions.ISessionService.OpenSession(IRequestContext requestContext) in SessionService.cs:23

記載されている方法は次のとおりです。

private bool SubmitChanges()
{
   _sqlContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
   return _sqlContext.ChangeConflicts.Count == 0;   
}

public bool UpdateSession(Session session)
{
   var record = _sqlContext.SessionRecords.Single(x => x.SessionId == session.Key);
   _converter.PopulateRecordData(session, record);
   return SubmitChanges();
}

セッションサービスクラスが行うのは、セッションがデータベース内にありアクティブな場合はSqlXmlSessionStore.UpdateSession(session)を呼び出すこと、リクエストが新しく、セッションIDがないか一意の場合はSqlXmlSessionStore.InsertSession(session)を呼び出すことだけです。

SubmitChanges()を実行するたびにDataContextの新しいインスタンスを作成しようとしましたが、同じconnをプルしても、Connectionオブジェクトがありませんでした。設定からの文字列。これは私のローカルマシンと関係があるのでしょうか?

さて、私はうまくいくことをしましたが、これに私が予測していない問題があるかどうかはわかりません。

DataContextの送信を1回だけ許可します。これは、SubmitChanges()コードを次のように変更することで実現しました。

    private bool _canSubmit = true;

    bool SubmitChanges(){
        if(_canSubmit)
        {
            _sqlContext.SubmitChanges(ConflictMode.FailOnFirstConflict);
            _canSubmit = false;
            return _sqlContext.ChangeConflicts.Count == 0;      
        }
        return false;
     }

これはまだこれが機能するための非常にハッキーな方法のようです、そして私は問題の底に行きたいので、誰かがこれを修正する方法を知っているかどうかアドバイスしてください。

4

3 に答える 3

1

SubmitChanges内の変更セットを変更したり、部分クラスのオーバーライドされたメソッドでSubmitChangesを呼び出したりすることはできません。あなたがこれをしているのではないかと思いますが、私はあなたのコードフラグメントを完全にはフォローしていません。

編集

DataContextの存続期間がどのように管理されているのかわかりません。質問の最初の部分であなたは言います

サービスを呼び出すたびに、DataContextの個別のインスタンスを作成しています

しかし、第二部であなたは言います

SubmitChanges()を実行するたびにDataContextの新しいインスタンスを作成しようとしましたが、その結果、Connectionオブジェクトがありませんでした。

次に理解できないのは、SubmitChangesを1回だけ呼び出す変更されたメソッドがどのように機能するかです。これは、最初の呼び出し後に行われたデータへの変更を破棄するため、すべてのデータまたは最初の呼び出し後の呼び出しをログに記録していない必要があります。変更を送信する必要はありません。

Datacontextのインスタンスメソッドはスレッドセーフではありません。アプリケーションの起動時にグローバル変数に入れることはできません(そうしていますか?)。通常、HTTPリクエストごとに新しいDatacontextが必要です。これは、制御の反転フレームワークを使用するか、コード内で実行できます。リクエストの最初にdataconextを新しくし、最後にsubmitchangesを呼び出します。

もう1つの手法は、複数のDataContextを使用し、datacontextを作成し、変更を加え、submit chnagesを呼び出し、DataContextを破棄することです。これは、非常に軽量です。変更の送信を複数回呼び出す必要はほとんどありません。これを行ったのは、SQLステートメントの実行順序を制御することだけです。

最小限の例を作成して、コード全体を投稿できればよいでしょう。

于 2010-11-02T20:27:55.107 に答える
1

私の投稿からこれを知る方法はなかったでしょうが、私は問題を見つけました。HttpModuleで依存性注入を設定しましたが、構成関数がロックされていました。StructureMapの使い方を最初に学んだときに、どこかからコピーした(そして忘れてしまった)古いコードからそこにあったと思います。私はロックを外しました、そしてそれは働きました。(まあ、少なくともそれは新しい、無関係のエラーを生成し始めました)。

ああ、それが私のDataContextに影響を与えていた理由は、Datacontextのインスタンスをラップしたクラスがロック内にあったためです。

于 2010-11-05T06:41:43.920 に答える
0

デバッガーを接続して、その行為で例外をキャッチすることをお勧めします。そこから、それがどこから来ているのかを追跡できるはずです。

SubmitChangesまたは、エラーの元の部分を追跡するために、これまでの呼び出しでスタックトレースをオーバーライドしてログに記録します。

于 2010-11-02T06:35:59.327 に答える