序列化 LinqToSql 生成的实体,保持关系和延迟加载

本文关键字:关系 延迟加载 实体 LinqToSql 序列化 | 更新日期: 2023-09-27 18:34:19

我们有一个相当大的 ASP.NET MVC项目,使用LINQ到SQL,我们正在迁移到Windows Azure。

现在,我们需要序列化对象以存储在 Azure 分布式缓存中,并在 .dbml 文件中将">序列化模式"设置为">单向",从而相应地使用DataContractDataMember属性自动修饰生成的类和属性,似乎是推荐的方法。但是,这使得 LINQ to SQL 尚未加载的任何关系在序列化并另存为 null 时都会丢失。

考虑到

以下几点,首选的处理方式是什么:

  • 如前所述,这是一个相当大的项目,生成的 *.designer.cs 文件接近 1.5MB
  • 完全禁用延迟加载很可能是一个大问题由于许多深厚的阶级关系,性能受到打击
  • 更改ORM工具是我们正在考虑的事情,但是在切换平台的同时执行此操作可能是一件坏事。

如果这归结为以某种方式手动指定要在整个项目中序列化的对象和关系;使用protobuf-net之类的东西来获得一些额外的性能提升可能不会是一个巨大的进步。

序列化 LinqToSql 生成的实体,保持关系和延迟加载

但是,这使得 LINQ to SQL 尚未加载的任何关系在序列化时丢失并另存为 null。

的,这在序列化时是正常的和预期的 - 您实际上是在拍摄当时可用内容的快照,因为延迟加载取决于通过数据上下文加载它。任何工具都不愿意抓取整个模型以查找要加载的内容,因为这可能会无限期地持续下去,基本上会使大量不需要的数据发挥作用。

选项:

  • 在序列化之前显式获取(通过"loadwith"抢占,或通过点击适当的属性(您感兴趣的数据
  • 或者,将数据加载到一个完全独立的 DTO 模型中进行序列化 - 在许多方面,这是对第一个模型的重新陈述,因为它必然涉及迭代(投影(您想要的数据,但这意味着您正在创建 DTO 以适应您实际想要发送的确切形状