抱歉我的英语不好。
我从DB
生成了一些类和EF Context1.Question
public int Id { get; set; }
public string Content { get; set; }
public virtual ICollection<Answer> Answer { get; set; }
2.Answer
public int Id { get; set; }
public string Content { get; set; }
public bool IsTrue { get; set; }
public virtual Question Question { get; set; }
所有CRUD均通过本服务制作。这是问题的更新方法
public void Update(Question q)
{
var editQuestion = GetById(q.Id); //get entity by id
editQuestion.Answer = null;
_repository.Update(editQuestion);
q.Answer.Each(answer => answer.Question=editQuestion);
editQuestion.Answer = q.Answer;
editQuestion.Content = q.Content;
_repository.Update(editQuestion);
_unitOfWork.Commit();
}
_repository.Update(T Entity)=&gt;
public virtual void Update(T entity)
{
DbEntityEntry entityEntry = _context.Entry<T>(entity);
entityEntry.State = EntityState.Modified;
}
现在在Db中没有更新旧的答案,但添加了新的(q.Answer)。在q.Answer可能包含更新的旧答案和一些新的。
我如何更新问题?
UPD:_unitOfWork.Commit()
public void Commit()
{
_context.SaveChanges();
}
答案 0 :(得分:1)
无需使用进入状态。只需通过其Id获取实体,修改相关属性,从上下文中删除旧答案,将新的答案添加到集合中,调用SaveChanges()
并完成工作。
通常情况下,会写一些类似的内容:
public void Update(Question q)
{
using(var context = new MyDbContext())
{
var entity = context.Question.Find(q.Id);
entity.Content = q.Content;
foreach(var oldAnswer in entity.Answer)
{
context.Answers.Remove(oldAnswer);
}
entity.Answer.Clear();
foreach(var newAnswer in q.Answer)
{
entity.Answer.Add(newAnswer);
}
context.SaveChanges();
}
}
如果您没有使用using
模式,请不要忘记通过调用context.Dispose()
来最后处理上下文。
请注意,这是一个解决方案,即答案记录将从数据库中删除并重新创建,即使它们没有更改。
或者,您可以编写一个解决方案,更新现有记录,只删除不再存在的答案:
public void Update(Question q)
{
using(var context = new MyDbContext())
{
var entity = context.Question.Find(q.Id);
entity.Content = q.Content;
foreach(var newAnswer in q.Answer)
{
if (entity.Answer.All(a => a.Id != newAnswer.Id)
{
entity.Answer.Add(newAnswer);
}
}
foreach(var oldAnswer in entity.Answer)
{
if (q.Answer.All(a => a.Id != oldAnswer.Id)
{
context.Answers.Remove(oldAnswer);
}
else
{
var newAnswer = q.Answer.Single(a => a.Id == oldAnswer.Id);
oldAnswer.Content = newAnswer.Content;
oldAnswer.IsTrue = newAnswer.IsTrue;
}
}
context.SaveChanges();
}
}