尝试从父对象中删除多个深子对象。
这是一项调查,我试图在将QuestionType对象添加到数据库之前删除它(但保留QuestionType键)。
树是这样的:
Survey.SectionList.Section.QuestionList.Question.QuestionType
我想这样:
Survey.SectionList.Section.QuestionList.Question
我从一个由其他系统实例导出的XML文件中导入Survey对象。部分导出是QuestionType。当我导入调查并将其推送到Survey对象然后使用db.Add跟随它时,然后添加QuestionType记录而不是仅引用现有记录。
(我想)我知道我可以把它全部放在一系列foreach循环中,以便进入问题层,但这看起来很老了。
提前感谢您对这个幼儿心灵的耐心。
答案 0 :(得分:1)
您可以获得所有问题,然后进行修改:
给出:List<Survey> surveyList
List<Question> questions = surveyList.SelectMany(s => s.SectionList)
.SelectMany(sl => sl.Section)
.SelectMany(sct => sct.QuestionList)
.SelectMany(ql => ql.Question).ToList();
foreach(Question q in questions)
q.QuestionType = null;
或者你可以通过使用&#34; linq-to-objects更新&#34;来获得更多的幻想:
surveyList.SelectMany(s => s.SectionList)
.SelectMany(sl => sl.Section)
.SelectMany(sct => sct.QuestionList)
.SelectMany(ql => ql.Question)
.Select(q =>
{
q.QuestionType = null;
return q;
}).ToList();
答案 1 :(得分:0)
您可以覆盖SaveChanges
类中的DbContext
,并将QuestionType
个对象的状态设置为UnChanged
:
public override int SaveChanges()
{
var oc = ((IObjectContextAdapter)this).ObjectContext;
oc.DetectChanges();
foreach (var ent in oc.ObjectStateManager
.GetObjectStateEntries(EntityState.Added)
.Select(e => e.Entity)
.OfType<QuestionType>())
{
oc.ObjectStateManager.ChangeObjectState(ent, EntityState.Unchanged);
}
return base.SaveChanges();
}
通过将状态设置为UnChanged
,Question
和QuestionType
之间的关联将保持不变,但现在只保存外键值,而不是QuestionType
s
答案 2 :(得分:0)
你们真是太棒了。感谢我的基本糟糕的帖子中的各种真实答案。
这就是我昨天终于开始工作了,所以我可以继续前进。但是,在我添加单元测试后,我将重构你的一个回复。
private Survey PrepSurveyForAdd(Survey survey)
{
//Loop through the sections
foreach (SurveySection ss in survey.SurveySections)
{
foreach (SectionQuestion sq in ss.Section.SectionQuestions)
{
sq.Question.QuestionType = null;
}
}
return survey;
}
我之所以没有坚持这一点,以及我最初发布的原因,是因为我不仅在引用树下遇到问题,而且因为我想了解更多关于Linq的真实世界,这对我来说很重要,例如。