1

私は EF を初めて使用しますが、シナリオを説明するために最善を尽くします。私のDBには、RecommendationTopic、Recommendation、およびQuestionという3つのテーブルがあります。各 RecommendationTopic には複数の推奨事項を含めることができ、各推奨事項には複数の質問を含めることができます。質問テーブルに事前定義済みの質問があるとします。

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

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

コードが以下のような RecommendationTopic と Recommendation を作成するために使用される別のサービスがあります。

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

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

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 に挿入するクエリだけでなく、質問テーブルも生成されます!

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

質問は、切断されたシナリオで機能させるにはどうすればよいですか?

私のクライアントは、別の呼び出しで質問ドロップダウンを入力し、別の呼び出しで推奨トピックを保存する必要がある Silverlight クライアントである可能性があります。このため、セルフ トラッキング エンティティも使用しています。

ご意見をお待ちしております。-ヴィノード

4

1 に答える 1

1

STE (セルフ トラッキング エンティティ) を使用している場合は、次のManageRecommendationようになります。

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

呼び出すAddObjectと、エンティティの自己追跡動作がスキップされます。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();
    }
}
于 2011-06-27T07:12:32.970 に答える