2013-08-20 4 views
1

Dans mon modèle, une question peut avoir plusieurs réponses valides et une réponse peut être utilisée pour de nombreuses questions. J'ai un index unique sur la propriété Answer.Text pour éviter les doublons et assurer la validation est efficace. J'ai ce code dans ma méthode Seed.Comment créer des relations en utilisant le code en premier

Answer _None = new Answer { Text = "None", SortOrder = 50 }; 
    context.Answers.AddOrUpdate(x => x.Text, _None); 
    context.SaveChanges(); 

    Question q = new Question 
    { 
     Text = "Bathroom flooring", 
     Answers = new Answer[] 
       { 
        _None,  
        new Answer { Text = "Carpet", SortOrder = 60} 
       } 
    } 
    context.Questions.AddOrUpdate(x => x.Text, q); 
    context.SaveChanges(); 

La méthode renvoie une erreur, car un autre insert est tentée sur le deuxième appel à context.SaveChanges() pour la réponse avec le texte « Aucun ». * Impossible d'insérer une ligne de clé en double dans l'objet 'dbo.Answers' avec l'index unique 'IX_NaturalKey' *. La valeur clé en double est (None) « Pourquoi une deuxième tentative d'insertion lorsqu'un objet existant est ajouté à une relation et est-il un moyen pour l'empêcher

+0

J'ai essayé le code et cela a bien fonctionné – zsong

+0

Essayez d'extraire la réponse _None de votre contexte lorsque vous insérez dans votre tableau de réponses à la question peut être un problème avec elle ne sachant pas qu'il est dans le contexte – Thewads

+0

@sza J'utilise EF6 release candidate Peut-être y a-t-il un problème avec cela ... En attendant, comme il s'agit probablement de données fixes requises en production, j'ai décidé d'insérer les données via des instructions sql afin que je puisse faire l'insertion dans la méthode Up d'une migration, et j'ai garé le problème pour l'instant – Colin

Répondre

0

vous pouvez utiliser quelque chose comme ceci:.?

context.Question.AddOrUpdate(
       p => p.Id, 
       new Models.Question 
       { 
        Question = "Bathroom flooring", 
        //Active = true, 
        Answers = new System.Collections.Generic.List<Answers>(){ 
         new Answers {Id=1, Text = "Carpet",SortOrder=60 }, 
         new Answers {Id=2, Text = "Carpet",SortOrder=60 }, 
      new Answers {Id=3, Text = "Carpet",SortOrder=60 }, 
      new Answers {Id=4, Text = "Carpet",SortOrder=60 }, 
      new Answers {Id=5, Text = "Carpet",SortOrder=60 }, 
        } 
       }); 
+0

Dupliquer le texte dans le tableau Réponses n'est pas autorisé. Donc beaucoup de réponses "Tapis" avec des ID différents ne sont pas autorisés. Ce que je veux faire, c'est pouvoir ajouter une réponse avec le texte "Aucun" comme réponse valide à plus d'une question. Donc, je peux aussi avoir Question.Text = "Plancher de cuisine" avec Question.Answer = _Non – Colin

+1

ces textes sont des exemples que vous pouvez changer. –

Questions connexes