在实体框架 4.3 中更新对象的列表属性 - 代码优先,N 层

本文关键字:代码 属性 列表 框架 实体 对象 更新 | 更新日期: 2023-09-27 18:35:36

在 n 层方案中,数据层应如何更新 EF 4.3 中对象的 List 属性?

假设我们有这个类:

public class Foo
{
  public int Id { get; set; }
  public string Name { get; set; }
  public List<Bar> Bars { get; set; }
}

这在保存/更新 ID 和名称方面效果很好,但 Bars 属性将被忽略。

protected void SaveChanges(Foo foo)
{
  this.Database.Entry<Foo>(foo).State = GetState(foo);
  this.Database.SaveChanges();
}

由于原始上下文(检索到 Foo 的上下文)不再在内存中,数据层应如何处理保存对 Bars 属性的更新?EF 如何知道哪些 Bar 项已删除、哪些已更新以及哪些已添加?

注意:我可以遍历每个 Bar 项并将其与原始项进行比较,但我猜 EF 不应该以这种方式工作。这似乎很乏味和不正确。

在实体框架 4.3 中更新对象的列表属性 - 代码优先,N 层

EF 如何知道哪些 Bar 项目已被删除,哪些已被删除 已更新,已添加哪些内容?

如果你自己写持久性,它应该如何知道变化?我想你会选择以下两个选项之一:

  • 您将查询数据库的当前状态,并将其与接收状态进行比较,以查找已更改的内容
  • 您将在类中添加一些帮助程序字段,并让客户端告诉您更改了什么

在这两种情况下,您都将使用有关更改的信息来生成正确的 SQL。

EF 仅解决最后一点(SQL 生成),但你仍有责任告诉它更改了什么。