【问题标题】:How to seed relationships using code first如何首先使用代码播种关系
【发布时间】:2013-08-20 16:49:48
【问题描述】:

在我的模型中,一个问题可以有许多有效的答案,并且一个答案可以用于许多问题。我在 Answer.Text 属性上有一个唯一索引,以防止重复并确保验证有效。我的 Seed 方法中有这段代码。

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

该方法引发错误,因为在第二次调用 context.SaveChanges() 时尝试另一个插入以获取文本为“None”的答案。 *无法在具有唯一索引“IX_NaturalKey”的对象“dbo.Answers”中插入重复的键行*。重复键值为 (None)。”为什么在将现有对象添加到关系时会尝试第二次插入,有没有办法阻止它?

【问题讨论】:

  • 我试过代码,效果很好。
  • 在插入问题答案数组时,尝试从上下文中提取 _None 答案。可能只是不知道它在上下文中的问题
  • @sza 我正在使用 EF6 候选版本。也许这有问题......同时,由于这可能是生产中所需的固定数据,我决定通过 sql 语句插入数据,以便我可以在迁移的 Up 方法中进行插入,我现在已经解决了这个问题

标签: entity-framework code-first seeding


【解决方案1】:

你可以使用这样的东西:

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

【讨论】:

  • Answers 表中不允许出现重复文本。因此,不允许使用许多具有不同 ID 的“地毯”答案。我想要做的是能够添加一个带有“无”文本的答案作为对多个问题的有效答案。所以我也可以有 Question.Text = "Kitchen floor" 和 Question.Answer = _None
  • 这些文本是您可以更改的示例。
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 2015-09-28
  • 2013-09-14
  • 1970-01-01
  • 2019-11-11
  • 2012-01-04
  • 1970-01-01
  • 2019-04-06
相关资源
最近更新 更多