1

これは私の最初の投稿です。EF STEとセルフリファレンステーブルの問題

ここに私の問題があります: 私はユーザータイプと呼ばれる私のデータベースにテーブルがあります。それは:

  1. IDです。
  2. IsPrivate;
  3. Parent_ID;

関連するものが最初と3番目です。 という別のテーブルUserTypes_Tがあります。このテーブルには、言語固有のさまざまなタイプの情報があります。フィールドは次のとおりです。

  1. Language_ID;
  2. UserType_ID;
  3. 名前;

私は何を達成しようとしていることUserTypesテーブルから階層全体をロードして(これは今のところ関係ありません)ツリービューでそれを示しています。次に、いくつかのユーザータイプを選択することによって、別の編集ボックス(名前)とコンボボックス(親)で編集することができます。

データベース内の変更を永続化しようとするまで、すべて正常に動作します。 EFは私のためにそれらのテーブル用の2つのエンティティクラスを生成しました:

ユーザーの種類のクラスがあります。

  1. IDを。
  2. IsPrivate;
  3. Parent_ID;
  4. 自己参照のナビゲーションプロパティ(0..1)。
  5. 子要素のナビゲーションプロパティ。
  6. UserTypes_Tテーブル(1 .. *)の別のナビゲーションプロパティ。

翻訳についてのクラスがあります

  1. UserType_IDと、
  2. Language_ID;
  3. 名前;
  4. UserTypesテーブル(* .. 1)へのナビゲーションプロパティ。
  5. 言語テーブル(* .. 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_IDnullを変更することでした。再度設定した場合、EFはUserTypes1も設定します。この動作を停止する方法があるのでしょうか?

答えて

1

[OK]みんな、私は問題が何であるかを見つけました。他の誰かが同じ問題に遭遇した場合、回答を投稿しています。

問題は、ユーザーの種類間に循環参照がないかどうかを確認するためにサーバー上で検証を行っていたことでした。

using (MyEntities context = new MyEntities()) 
{ 
    string errMsg = MyValidator.ValidateSomething(context.UserTypes,...); 
    if (!string.IsNullOrEmpty(errMsg)) throw new FaultException(errMsg); 
    //some other code here... 
    context.UserTypes.ApplyChanges(_userType);//_userType is the one that is updated 
    context.UserTypes.SaveChanges(); 
} 

問題の検証を行う際に、コンテキストが満たされていることで、変更内容を保存しようとしたとき、同じキー値を持つオブジェクトがある:だから、サーバー上の私の方法は次のように見えました。

ソリューションは単純です - サーバ上で物事を検証するための異なるコンテキストを使用する:

using (MyEntities validationContext = new MyEntities()) 
{ 
    //validation goes here... 
} 
using (MyEntities context = new MyEntities()) 
{ 
    //saving changes and other processing... 
} 

もう一つはなりますそれだ

using (MyEntities context = new MyEntities()) 
{ 
    using (MyEntities validationContext = new MyEntities()) 
    { 
     //validation 
    } 
    //saving changes and other processing... 
} 

!私はそれが誰かに役立つことを願っています!

関連する問題