Entity Framework - Поведение с несвязанным поведением в nTier - PullRequest
1 голос
/ 27 июня 2011

Я новичок в EF, но постараюсь описать сценарий. У меня есть 3 таблицы в моей БД, а именно Рекомендация, Рекомендация и Вопрос. Каждая Рекомендация может иметь несколько Рекомендаций, а каждая Рекомендация может иметь несколько вопросов. Предположим, что у меня уже есть предопределенные вопросы в моей таблице вопросов.

У меня есть один сервис, который возвращает мне список вопросов, как показано ниже:

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

У меня есть еще одна служба, которая используется для создания Рекомендации и Рекомендации, код которой выглядит примерно так:

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, он не только генерирует запрос для вставки в Рекомендацию и Рекомендацию, но и в таблицу вопросов!

Я уверен, что это вызвано разным контекстом для обоих вызовов, поскольку, когда я выполняю похожий код в одном контексте, он работает так, как должен работать.

Вопрос в том, как мне заставить его работать в автономном сценарии?

Мой клиент может быть клиентом Silverlight, где мне нужно заполнить выпадающий Вопрос отдельным вызовом и сохранить тему Рекомендации в отдельном вызове. По этой причине я также использую сущности самопроверки.

Любой вклад приветствуется! -Vinod

1 Ответ

1 голос
/ 27 июня 2011

Если вы используете 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();
    }
}
...