2009-07-14 14 views
4

こんにちは、大丈夫、ここにシナリオです:HasLoadedOrAssignedValueプロパティがtrueに設定されているのはなぜですか?

VS 2008 .NET 3.5 SP1、LINQ to SQL。

私はImage Entityを持つプロダクトエンティティを持っています。そのためImage Entityとの関係があります。これはすべてスキーマとDBMLで定義されています。

ImageIDを付けずに新しいProductエンティティを作成してDBに保存するとします。この時点で、Entityの_ImageフィールドにはHasLoadedOrAssignedValueがfalseに設定されています。

ImageIDを持たないDBからそのエンティティを取得すると、ImageIDはnullに設定され、Image Entityもnullに設定され、HasLoadedOrAssignedValueはtrueに設定されます。なぜ??

ImageIDプロパティを有効なintに設定しようとすると、ForeignKeyReferenceAlreadyHasValueException例外が発生します。

今、私は、「ああ、あなたは関係プロパティ自体を設定しなければならないので、Product.Image = someImageではなくProduct.ImageID = 2」ということを知っていますが、私は常にIDフィールドを設定します。いつもほとんど常に、よく....だから、

動作しますが、私の質問は2つあり:

  1. は、なぜそれがない
  2. もっと重要なのは、なぜ私はこれを経験していなければならないときにtrueに設定HasLoadedOrAssignedValueですインコヒーレントな動作。私はエンティティプロパティを直接設定する必要はないことを知っています。なぜ今はこのプロパティが機能していませんか?これがLINQ to SQLルールの場合、なぜルールが壊れることがありますか?

歓声!

+0

質問: 明示的にIDをnullに設定していますか、設定していませんか? ImageIDは画像のPKであり、ヌル値ではありませんか? イメージオブジェクトを設定しても機能しますか?私はそれがあなたがしたいことではないことを知っていますが、その作業が潜在的な原因のリストを絞り込むかどうかを判断します。 1&2は詳細を知らなくても答えにくいです。 –

答えて

2

問題はImageプロパティを見て、それが読み込まれる原因になっています。おそらくデバッガです。

Product.Imageプロパティにブレークポイントを設定し、どのパスがその原因であるかを確認します。

+1

それはまさに問題です。テストシナリオでは、デバッグせずに1回実行し、2番目のケースでは、さまざまなプロパティを見て実行しました。これによりエラーが発生しました。明らかに、コード内の任意の時点で、上記のプロパティの値をチェックすると、デバッグなしでエラーが発生する可能性があります。 – andy

+0

本当に、私は値をチェックしているだけなので、奇妙な動作です...そして、実際には "null"か "Nothing"であれば、何も読み込まれません...いいえ? – andy

+1

コードを見ると、プロパティアクセサーが遅延ロードの実装であることがわかります。プロパティにアクセスすると、外部キーを使用してデータベースにアクセスし、オブジェクトを作成してプロパティに割り当てることができます。これを実行すると、FKとエンティティプロパティが一致しなくなるため、外部キーを変更することが嫌いです。 – DamienG

1

これは今日も同じ問題を抱えていましたが、これが誰にも役立つかどうかはわかりませんが、私のLINQ Entity DBMLファイルでは、ユーザーIDごとにレビューとユーザーの関係がありました。この関係の名前はUser1です。フォームを読み込んだときに、その関係を使ってステータスバーに情報を設定しました。残念ながら、フォーム上の他の場所にドロップダウンリストにあるユーザーのリストもありました。したがって、ドロップダウンを変更しようとしたときに、データが既に使用されていたことが分かりました。フォームのステータスバーに別のlinqクエリを実行すると、すべてが機能しました。私はそれが期待される行動だと知っていますが、かなりイライラしていました。

関連する問題