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

Mar*_*ijn 12 c# entity-framework ef-code-first asp.net-mvc-3

我有一个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;}
}
Run Code Online (Sandbox Code Playgroud)

我有一个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);
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ijn 4

我通过将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;}
}
Run Code Online (Sandbox Code Playgroud)

为什么这个外键属性而不是 EF 生成的外键来完成这项工作?

  • 在断开连接的情况下,当您没有外键时,存在 EF 无法解决的一些间隙,您必须证明额外的代码。否则看不到这种关系。使用 FK 属性,它是一个标量值,并且 EF 可以更轻松地跨进程进行跟踪。事实上,我写的 2012 年 1 月数据点专栏就是关于这个主题的!当您拥有 FK 标量属性时,EF 会更容易使用。否则,您期望“正常工作”的许多功能将无法实现,并且它会迫使您更好地了解正在发生的情况以及如何提供所需的信息。抱歉我之前没看到失踪的FK (3认同)