Entity framework 如何首先使用代码为关系设定种子
在我的模型中,一个问题可以有许多有效的答案,并且一个答案可以用于许多问题。我在Answer.Text属性上有一个唯一的索引,以防止重复并确保有效验证。我的Seed方法中有此代码Entity framework 如何首先使用代码为关系设定种子,entity-framework,code-first,seeding,Entity Framework,Code First,Seeding,在我的模型中,一个问题可以有许多有效的答案,并且一个答案可以用于许多问题。我在Answer.Text属性上有一个唯一的索引,以防止重复并确保有效验证。我的Seed方法中有此代码 Answer _None = new Answer { Text = "None", SortOrder = 50 }; context.Answers.AddOrUpdate(x => x.Text, _None); context.SaveChanges(); Question q =
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”中插入重复的键行。重复的键值为(无)。“在将现有对象添加到关系中时,为什么要尝试第二次插入?有什么方法可以阻止它吗?您可以使用以下方法:
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 },
}
});
context.Question.AddOrUpdate(
p=>p.Id,
新模型。问题
{
问题=“浴室地板”,
//活动=真,
Answers=new System.Collections.Generic.List(){
新答案{Id=1,Text=“地毯”,SortOrder=60},
新答案{Id=2,Text=“地毯”,SortOrder=60},
新答案{Id=3,Text=“地毯”,SortOrder=60},
新答案{Id=4,Text=“地毯”,SortOrder=60},
新答案{Id=5,Text=“地毯”,SortOrder=60},
}
});
我尝试了该代码,效果很好。在插入问答数组时,尝试从上下文中提取“无”答案。可能是因为不知道它在context@sza我使用的是EF6发行版候选版。这可能有一个问题……同时,因为这可能是固定的数据要求我已经决定通过sql语句插入数据,这样我就可以在迁移的Up方法中进行插入,并且我已经暂时解决了问题,答案表中不允许出现重复文本。因此,不允许使用大量不同Id的“地毯式”答案。我想做的是能够添加一个带有文本“无”的答案“作为一个以上问题的有效答案。所以我也可以用Question.Text=“Kitchen Flooding”和Question.Answer=\n这些文本是可以更改的示例。