EF导航属性更新

时间:2015-01-18 19:31:10

标签: c# entity-framework

抱歉我的英语不好。

我从DB

生成了一些类和EF Context

1.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();
}

1 个答案:

答案 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();
  } 
}