6

最近クライアントからエラー レポートを受け取りましたが、うまく解決できません。何が間違っているのか、誰かが私に洞察を与えてくれることを願っています。

エラーは十分に単純に思えます:

Csla.DataPortalException: DataPortal.Delete が失敗しました (System.InvalidOperationException: シーケンスには System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 ソース) に複数の要素が含まれています)

これは、FileId (PK) をパラメーターとして受け取る DataPortal_Delete メソッドです。

private void DataPortal_Delete(SingleCriteria<File, Guid> criteria)
    {
        using (var ctx = ContextManager<Ronin.Data.RoninDataContext>
                    .GetManager(Database.ApplicationConnection, false))
        {
            var data = ctx.DataContext.Files
                    .Single(row => row.FileId == criteria.Value);

            ctx.DataContext.FileSources.DeleteAllOnSubmit(data.FileSources);

            ctx.DataContext.Files.DeleteOnSubmit(data);

            ctx.DataContext.SubmitChanges();
        }
    }

最初にチェックしたのは、同じ FileId を持つ別のレコードがあるかどうかを確認することでした (ただし、主キーであるため、これは不可能なはずです)。実際、すべての FileId は一意でした。クライアント データベースに接続するアプリケーションを起動し、レコードを削除しようとしましたが、問題なく動作しました。クライアント サイトの IT 担当者は、「Problem Step Recorder」を使用して、ユーザーが実行したアクションの段階的なスクリーンショットを送ってくれました。異常はなく、別のマシンを使用したところ、エラーなしでレコードを削除できました。どうやらこれは、アプリケーションが Windows 7 で実行されている場合にのみ発生します。

とはいえ、何がこれを引き起こしているのかについてのアイデアはありますか?

4

3 に答える 3

1

次の代わりに、Single の呼び出しが問題の原因であると仮定します。

ctx.DataContext.Files.Single(...)

そのクエリから複数の行が返されるようにコードを変更し、複数の行が返されたときに返されるものをログに記録します。これは、「重複」データの問題を指摘する必要があります。

注目すべきもう 1 つの点は、舞台裏で生成されている SQL です。それが役立つかどうかはわかりませんが、害はありません。あなたのデータモデルがわからないので、あなたのコードを思うように理解できません。

于 2010-01-21T13:28:31.297 に答える
0

1 つのエンティティを削除するときにも同じ例外がありました。dbml問題は-Fileで定義された外部キー関係であることが判明しました。これが私の場合の例外の理由でした。レコードを削除するために機能したことを削除した後(そして、他のテーブルからレコードをカスケード削除したくありませんでした。外部キー列をnullに設定するようにlinq-to-sqlを構成する方法を見つける必要があります)

于 2013-06-17T14:31:58.757 に答える
0

Windows 7 でのみ発生する場合は、OS が原因である可能性があります。Vistaで試してみましたか?Vista の環境は Windows 7 でも同様です。Windows Virtual PC + XP Mode も使用できます。これは、ユーザーが Windows XP で使用していたようにアプリケーションを実行できるようにするために、Windows 7 用に特別に設計された仮想化アプリケーションです。注: XP モードには、仮想化対応プロセッサが必要です。

于 2010-02-24T06:04:55.527 に答える