如何更新实体框架中的相关实体

我有一个MVC项目,并使用Entity Framework Code First和POCO对象作为数据库。 例如:

public class ClassA
{
  public int? Id {get; set;}
  public string Name { get; set;}
  public virtual ClassB B {get; set;}
}

public class ClassB
{
  public int? Id {get;set;}
  public string Description {get;set;}
}

我有一个创建或编辑模型的ActionResult。 问题是当我调用这个ActionResult来更新模型,并且model.B已被更改时,该关系不会保存在数据库中。 当调用ActionResult来创建一个新对象时,它按预期工作。 我该如何解决这个问题?

public ActionResult Save(ClassA model)
{
  model.B = GetBFromDb(model.B.Id.Value);

  if(ModelState.IsValid)
  {
    if (id.HasValue)
    {
      context.Entry(model).State = System.Data.EntityState.Modified;
    }
    else
    {
      context.ClassAs.Add(model);
    }
    context.SaveChanges();
    // redirect to index etc.
  }
  return View("EditForm", model);
}

我通过将ClassA与外键一起更改为ClassB来解决此问题,并设置了BId的值:

public class ClassA
{
  public int? Id {get; set;}
  public string Name { get; set;}
  public int BId {get;set;} // foreign key to B
  public virtual ClassB B {get; set;}
}

为什么这个外键属性会​​执行这个工作,而不是生成的EF的外键?


你不能简单地打电话给:

context.Entry(model).State = System.Data.EntityState.Modified;

首先必须从上下文中检索实体,以便EF可以开始跟踪它。 然后,您需要在调用context.SaveChanges()之前对该实体应用任何更改。

var entity = context.ClassAs.Find(model.Id);

// set properties you want to modify on entity
entity.Name = model.Name;
entity.ClassB = context.ClassBs.Find(model.ClassB.Id);
// other changes to entity as required...

context.SaveChanges();

通过这种方式,EF正在跟踪entity并知道对其应用更新。


如果你附加,然后设置状态为已修改的实体框架将发送所有属性进行更新。 您不必在下面采用水獭方法,因为这会导致发生一整个单独的负载。 如果你这样做,那么在模型中传递没有意义,只有一个id,然后调用TryUpdateModel来填充表单中的属性。

就个人而言,这里修改的附件更清洁一点,因为它不需要加载数据就可以完成往返

http://geekswithblogs.net/michelotti/archive/2009/11/27/attaching-modified-entities-in-ef-4.aspx

链接地址: http://www.djcxy.com/p/25473.html

上一篇: How to update related entities in Entity Framework

下一篇: Model updates to contained collection not saved in DB when saving parent entity?