1

I am new to EF but I will try my best to describe the scenario. I have 3 tables in My DB namely RecommendationTopic, Recommendation and Question. Each RecommendationTopic can have multiple Recommendations and each Recommendation may have multiple questions. Assume that I already have predefined questions in my Question table.

I have one service that returns me list of questions like below:

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

I have another service which is used to create RecommendationTopic and Recommendation whose code is something like below:

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

My client code looks like below:

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);
}

Since the client makes 2 separate service calls, the context would be different for both the calls. When I try to run this and check the EF profiler, it not only generates query to insert into RecommendationTopic and Recommendation but also Question table!

I am sure this is caused due to different context for both the calls as when I execute a similar code within a single context, it works as it's supposed to work.

Question is, how do I make it work in a disconnected scenario?

My client could be Silverlight client where I need to fill a Question drop down with a separate call and save Recommendation topic in a separate call. For this reason I am using self tracking entities as well.

Any input appreciated! -Vinod

Ladislav Mrnka
  • 360,892
  • 59
  • 660
  • 670
Vinod
  • 929
  • 1
  • 16
  • 42

1 Answers1

1

If you are using STEs (self tracking entities) your ManageRecommendation should look like:

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

Calling AddObject skips self tracking behavior of your entity. If you are not using STEs you must iterate through all questions and change their state to 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();
    }
}
Ladislav Mrnka
  • 360,892
  • 59
  • 660
  • 670