6

外部キー フィールドを更新しようとして、問題が発生しました。

record.ForeignId = newId;

をスローするSQLMetalコードが原因で、「オブジェクトの現在の状態のため、操作は無効です」と爆撃しますSystem.Data.Linq.ForeignKeyReferenceAlreadyHasValueException()

この問題に遭遇したのは私が初めてではありません。

LinqToSQLエラー : オブジェクトの現在の状態が原因で操作が有効ではありません。 、 とりわけ。

彼らの解決策はこれです:

record.Foreign = Database.Foreigns.Single(c => c.Id == newId);

それはもちろん、私がすでに知っている ID を持つオブジェクトを取得するためだけに、Foreign での DB ルックアップを引き起こします! では、無意味なクエリ (または、これらの FK が多数ある場合はクエリ) を使用せずに、この更新を行うにはどうすればよいでしょうか?

4

3 に答える 3

3

親のインスタンスを (正しい ID で) 新しく作成し、Attachそれを既存のレコード状態としてデータ コンテキストに追加してから、子オブジェクトの Parent プロパティを割り当てることができます。

ここにいくつかのコードがあります:

int theId = 5;
Parent p = new Parent() { Id = theId};
dc.Parents.Attach(p);
child.Parent = p;
于 2010-09-03T15:12:30.783 に答える
1

問題は解決しませんが、余分な負荷を部分的に回避する 1 つの方法は、既存の値が新しい値と異なるかどうかを確認することです。異なる場合は、クエリが発生します。何かのようなもの -

if(obj.PropertyID != newValue){
  obj.Property = PropertyClass.Load(newValue)
}
于 2013-03-06T21:56:14.580 に答える
0

同じ問題がありました。おそらく最善の解決策ではありませんが(パフォーマンスに影響を与える可能性があるため)、簡単な回避策を作成しましたが、うまくいきました。

私のソリューションでは、クラス レベルで宣言された DataContext を持つクラスがあるため、全体で使用できます。

私のソリューションでは、(あなたと同様に) ユーザーのアカウント タイプ ID を別のアカウント タイプ ID (データベースではこれらは FK) に変更するだけでした。

DataContext は既にロードされているため、変更が許可されていませんでした。回避策は?

DataContext の新しいインスタンスを作成し、LINQ クエリを実行し、変更を送信してから DataContext を破棄する関数を作成しました。

于 2014-12-30T06:27:53.447 に答える