1

私はEFの新人ですが、私はこのシナリオを説明するために最善を尽くします。私はMy DBに3つのテーブル、すなわちRecommendationTopic、Recommendation、Questionを持っています。各RecommendationTopicは複数のRecommendationを持つことができ、各Recommendationは複数の質問を持つことができます。質問テーブルには既に定義済みの質問があるとします。Entity Framework - nTierでの非結合の動作

私は私に以下のような質問のリストを返しつのサービスがあります。

public void ManageRecommendation(RecommendationTopic recommendationTopic) 
    { 
     using (Entities context = new Entities()) 
     { 
      context.AddObject("RecommendationTopics", recommendationTopic); 
      context.SaveChanges(); 
     } 
    } 

:私はそのコードが以下のようなものである別のRecommendationTopicを作成するために使用されているサービスや勧告を持って

public List<Question> FetchQuestions(int categoryID) 
    { 
     using (Entities context = new Entities()) 
     { 
      questions = context.Questions.Where(i => i.ID >= 0).ToList(); 
     } 
    } 

を私のクライアントコードは以下のようになります:

List<Question> questions; 
using (QuestionServiceClient client = new QuestionServiceClient()) 
{ 
    questions = client.FetchQuestions(); 
} 

using (RecommendationServiceClient client = new RecommendationServiceClient()) 
{ 
    RecommendationTopic rTopic = new RecommendationTopic(); 
    rTopic.CategoryID = 3; 
    rTopic.Name = "Topic From Client"; 
    Recommendation rCom = new Recommendation(); 
    rCom.Text = "Dont!"; 
    rCom.RecommendationTopic = rTopic; 
    rCom.ConditionText = "Some condition"; 
    rCom.Questions.Add(questions[0]); 
    rCom.Questions.Add(questions[1]); 
    client.ManageRecommendation(rTopic); 
} 

2つの別々のサービスコールでは、両方のコールでコンテキストが異なることがあります。これを実行してEFプロファイラをチェックしようとすると、RecommendationTopicとRecommendationに挿入するクエリだけでなく、Questionテーブルも生成されます。

これは、単一のコンテキスト内で同様のコードを実行するときと同じように、両方の呼び出しで異なるコンテキストが原因で発生したと確信しています。

質問:接続されていないシナリオではどのように動作させるのですか?

私のクライアントは別の呼び出しで[質問]ドロップダウンを入力し、別の呼び出しで推奨事項のトピックを保存する必要があるSilverlightクライアントになる可能性があります。このため、私は自己追跡エンティティも使用しています。

-Vinod

答えて

1

あなたはスイーツ​​(自己追跡エンティティ)を使用している場合は、あなたのManageRecommendationは、次のようになります。AddObjectを呼び出す

public void ManageRecommendation(RecommendationTopic recommendationTopic) 
{ 
    using (Entities context = new Entities()) 
    { 
     context.RecommendationTopics.ApplyChanges(recommendationTopic); 
     context.SaveChanges(); 
    } 
} 

エンティティの自己追跡動作をスキップします。 STEを使用していない場合は、すべての質問を繰り返して、状態をUnchangedに変更する必要があります。

public void ManageRecommendation(RecommendationTopic recommendationTopic) 
{ 
    using (Entities context = new Entities()) 
    { 
     context.RecommendationTopics.AddObject(recommendationTopic); 
     foreach (var question in recommendationTopic.Questions) 
     { 
      context.ObjectStateManager.ChangeObjectState(recommendationTopic, EntityState.Unchanged); 
     } 
     context.SaveChanges(); 
    } 
} 
+0

あなたは私の一日を作っています!ブリリアント!できます! – Vinod

関連する問題