1

現在、DataContext.SubmitChanges() を呼び出すときに「一連の変更でサイクルが検出されました」という例外が発生するアプリケーションを開発しています。この例外がスローされる理由はわかっていますが、状況の修正を見つけることができませんでした。状況を説明しましょう。以下に示すようなテーブルを持つデータベースがあり、LINQ to SQL でアクセスして vb.net のクラスにマップされます。

Device
-------
ID
DefaultGatewayID

DefaultGatewayID はデバイスであり、同じオブジェクトまたは別のデバイスにすることもできます。ユーザーは、DataGrid を備えた GUI を使用して、新しいレコードを変更および追加します。記録の更新は問題ありません。ID は既に存在し、DefaultGatewayObject がレコードに関連付けられています (ID はデータベースに保存されます)。

ただし、新しいレコードを追加して同じトランザクションで DefaultGatewayObject を設定しようとすると、「一連の変更で検出されたサイクル」という例外が発生します。この場合は同じ項目ですが、最初に追加するレコードがわからないため、LINQ to SQL が原因であると思われます。

送信ボタンが SubmitChanges を実行する XAML コマンドにバインドされているため、挿入を 2 つの部分に分割するオプションはありません。1 つはデバイス用で、次に DefaultGateway を追加します。

理想的には、どのオブジェクトを最初に作成するか、またはそのようなものを指定するオプションが必要です。それ自体への接続を削除して、このフィールドに ID を設定するだけのオプションだと思いますが、LINQ to SQL 内で修正を見つけたいと思います。

SOがこれに対する答えを持っていることを願っています。この関連記事「循環リンクリストの追加中にサイクルが検出されました」しか見つかりませんでした

4

1 に答える 1

1

挿入を 2 つの部分に分割できますが、コードをTransactionScope.

Using trans As New TransactionScope()
    'Code that generates a new ID in the database
    dc.SubmitChanges()

    'Code that uses the new ID value.
    dc.SubmitChanges()

    trans.Complete()
End Using

これが例外を回避する唯一の方法です。アーキテクチャの決定 (「送信ボタンが XAML コマンドにバインドされている」) のためにこれが不可能な場合は、アーキテクチャを変更する必要があります。いずれにせよ、UI コマンドは決してデータ アクセス レイヤーに近づけるべきではないと思います。XAML からサービス メソッドを呼び出すことをお勧めします。

于 2013-08-09T09:16:11.407 に答える