これは私の最初の投稿です。EF STEとセルフリファレンステーブルの問題
ここに私の問題があります: 私はユーザータイプと呼ばれる私のデータベースにテーブルがあります。それは:
- IDです。
- IsPrivate;
- Parent_ID;
関連するものが最初と3番目です。 という別のテーブルUserTypes_Tがあります。このテーブルには、言語固有のさまざまなタイプの情報があります。フィールドは次のとおりです。
- Language_ID;
- UserType_ID;
- 名前;
私は何を達成しようとしていることUserTypesテーブルから階層全体をロードして(これは今のところ関係ありません)ツリービューでそれを示しています。次に、いくつかのユーザータイプを選択することによって、別の編集ボックス(名前)とコンボボックス(親)で編集することができます。
データベース内の変更を永続化しようとするまで、すべて正常に動作します。 EFは私のためにそれらのテーブル用の2つのエンティティクラスを生成しました:
ユーザーの種類のクラスがあります。
- IDを。
- IsPrivate;
- Parent_ID;
- 自己参照のナビゲーションプロパティ(0..1)。
- 子要素のナビゲーションプロパティ。
- UserTypes_Tテーブル(1 .. *)の別のナビゲーションプロパティ。
翻訳についてのクラスがあります
- UserType_IDと、
- Language_ID;
- 名前;
- UserTypesテーブル(* .. 1)へのナビゲーションプロパティ。
- 言語テーブル(* .. 1)へのナビゲーションプロパティ。私のWCF Webサービスで
return context.UserTypes.Include("UserTypes_T").Where(ut => ut.IsPrivate==false).ToList();
:
は、私が使用して必要なデータを取得します。新しいユーザータイプを問題なく追加できますが、古いものを更新しようとすると、奇妙なことが起こります。
ルート要素(Parent_ID == null)を更新するとすべてが機能します。 私は、PARENT_ID = nullを、私は次のエラーを取得する要素更新する場合:!
AcceptChanges cannot continue because the object’s key values conflict with another object in the ObjectStateManager.
私はすべてインターネット上で検索をし、Diego B Vega(および多く)からブログ記事を読んで私の問題は異なっています。親のユーザータイプを変更すると、実際にはナビゲーションプロパティではなくParent_IDプロパティが変更されます。私はいつも問題を避けるために生成されたナビゲーションプロパティではなく、IDで作業しようとします。
私は、少し研究をした私が取得し、重複した事業体の多くがあったことを見たオブジェクトグラフであるかを確認してみました:
ルート要素はその子要素のリストを持っていました。各子要素には、ルートまたはその親への後方参照などがあります。想像できるでしょう。これらのナビゲーションプロパティを使用していないので、必要なデータを取得/設定するためにIDを使用したため、モデルから削除しました。具体的には、削除ポイントと UserTypesエンティティクラスから削除されました。それから、各要素が1回だけのオブジェクトグラフがありました。私は新しい更新プログラムを試しましたが、同じ問題がありました。
ルート要素は正常に更新されましたが、いくつかの親を持つ要素は同じ例外を投げました。
UserTypes_Tエンティティクラスのナビゲーションプロパティがあり、ユーザータイプを指していることがわかりましたので、削除しました。その後、このエラーは消えました。オブジェクトグラフのすべての項目は一意です。
if (!context.ObjectStateManager.TryGetObjectStateEntry(entityInSet.Item2, out entry))
{
context.AddObject(entityInSet.Item1, entityInSet.Item2);//here!
}
:私は何の問題も私のルート要素を更新することができますが、(なしの除外で)子供を更新しようとしたとき、私は、生成されModel.Context.Extensionsクラスのnull参照の例外が発生しました - しかし、問題は残りました私は名前(それはUserTypes_Tにある)だけを更新しようとしましたが、エラーは同じです。
私はアイデアがありません。私は今この問題を8時間解決しようとしています。誰かが私にアイデアを与えたり、自分の経験を分かち合うと感謝します。
PS:
私がデータを取得するには、次のコードを使用していた子オブジェクトを更新成功した唯一の方法:
var userTypes = argoContext.UserTypes.Include("UserTypes_T").Where(ut => ut.IsPrivate==false).ToList();
foreach (UserType ut in userTypes)
{
ut.UserType1 = null;
ut.UserTypes1 = null;
}
return userTypes;
UserType1が親ユーザーを指して、ナビゲーションプロパティをある
typeとUserTypes1は、ナビゲーション要素で、子要素のリストを保持します。ここでの問題は、EFがオブジェクトを「修正」して、Parent_ID〜nullを変更することでした。再度設定した場合、EFはUserTypes1も設定します。この動作を停止する方法があるのでしょうか?