将 POCO 对象树与实体框架同步

本文关键字:实体 框架 同步 POCO 对象 | 更新日期: 2023-09-27 18:35:42

假设我正在尝试构建一个三层电话簿应用程序,其中包含以下对应于数据库表的实体,相应的DTO对象,这些实体通过Web服务发送到AngularJS前端,用户可以在其中编辑整个电话簿,只需单击一个按钮即可保存/丢弃所有编辑(不保存单个编辑, 而是整本书)。

所以我的想法是将所有Contacts发送到 Web 应用程序,然后用户编辑联系人、详细信息、添加内容、删除内容,然后在保存时将所有数据发送回 Web 服务。

public class Contact{
   public int Id;
   public string Name;
   public List<PhoneNumber> PhoneNumbers;
   public List<AddressEntry> Addresses;
}
public class PhoneNumber{
   public int Id;
   public string Number;
   public string Type;
}
public class AddressEntry{
   public int Id;
   public string Line1;
   public string Line1;
}

是否有一些合理的方法可以将此对象树 - List<Contact>或(List<ContactDTO>看起来相同)重新连接到我的数据库上下文,并让实体框架确定应该插入具有空 ID 的联系人,应该删除缺少的联系人,应该更新具有修改属性的联系人?请记住,这些联系人也有子对象。

我不想为每个实体类编写特定的东西,因为实际上我将拥有大约 100 个这样的类(它是一个参数配置工具,其中包含许多不同参数类型的表),并且当前版本有超过 10K 行代码,重写的目的是让它合理缩短。

已经尝试过:我已经设法生成了一个弱解决方案,我强迫我的实体和 DTO 类实现interface IObjectWithKey { int Id; },然后制作一些能够检测添加/删除/更新的通用东西,然后使用 AutoMapper 将数据从实体传输到 DTO 类,但我在子列表方面遇到了麻烦。

我需要自己写吗?使用另一个框架(如NHibernate)会有所帮助吗?

将 POCO 对象树与实体框架同步

无论是在 Entity Framewoinrk 还是 NHibernate 中,如果您以正确的方式配置了类映射,这两个框架都能够检测属性和关联更改。

如果使用 AutoMapper 将 DTO 映射到域对象,则这里应该没有问题,因为实体框架更改跟踪仅跟踪对象图上的更改,而不关心您如何修改它(即通过手动设置属性或使用 AutoMapper 等库)。