1

Je suis nouveau à EF mais je vais essayer de mon mieux pour décrire le scénario. J'ai 3 tables dans Mon DB à savoirTopique, Recommandation et Question. Chaque RecommandationTopic peut avoir plusieurs Recommandations et chaque Recommandation peut avoir plusieurs questions. Supposons que j'ai déjà des questions prédéfinies dans mon tableau de questions.Entity Framework - Disconnexted Behavior dans nTier

J'ai un service qui me renvoie la liste des questions comme ci-dessous:

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

J'ai un autre service qui est utilisé pour créer RecommendationTopic et la recommandation dont le code est quelque chose comme ci-dessous:

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

Mon code client ressemble à ci-dessous:

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

Depuis le client fait 2 appels de service distincts, le contexte serait différent pour les deux appels. Lorsque j'essaie d'exécuter ceci et de vérifier le profileur EF, il génère non seulement une requête à insérer dans RecommendationTopic et Recommendation, mais aussi Table des questions!

Je suis sûr que cela est dû à un contexte différent pour les deux appels, car lorsque j'exécute un code similaire dans un seul contexte, cela fonctionne comme il est censé fonctionner.

La question est, comment puis-je le faire fonctionner dans un scénario déconnecté?

Mon client peut être un client Silverlight où je dois remplir une question déroulante avec un appel distinct et enregistrer la rubrique Recommandation dans un appel distinct. Pour cette raison, j'utilise également des entités de suivi de moi-même.

Toute saisie appréciée! -Vinod

Répondre

1

Si vous utilisez (ONC entités auto de suivi) votre ManageRecommendation devrait ressembler à:

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

Appel AddObject permet de sauter le comportement de suivi automatique de votre entité. Si vous n'utilisez pas STE, vous devez itérer à travers toutes les questions et changer leur état à 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

Vous avez fait ma journée! Brillant! Ça marche! – Vinod