代码之家  ›  专栏  ›  技术社区  ›  Eric Lennartsson

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

  •  1
  • Eric Lennartsson  · 技术社区  · 13 年前

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

    现在,我们需要序列化用于存储在Azure分布式缓存中的对象,并设置“ 序列化模式 “至” 单向的 ”,从而自动用 DataContract 和 DataMember 相应地,属性似乎是推荐的方式。然而,这会使LINQ到SQL尚未加载的任何关系在序列化时丢失,并保存为 null .

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

    • 如前所述,这是一个相当 大型项目 生成的*.designer.cs文件接近1.5MB
    • 禁用延迟加载 完全可能是一个大问题 性能命中率 由于许多深层次的阶级关系。
    • 更改ORM工具 是我们正在考虑的事情,但在切换平台的同时这样做可能是一件坏事。

    如果这归结为以某种方式手动指定在整个项目中序列化哪些对象和关系;使用类似的东西 原布夫网 对于一些额外的性能提升来说,这可能不是一个巨大的进步。

    1 回复  |  直到 13 年前
        1
  •  2
  •   Marc Gravell    13 年前

    然而,这使得LINQ到SQL尚未加载的任何关系在序列化时都会丢失,并保存为null。

    是的,这是正常的,在序列化时也是意料之中的——您实际上是在拍摄可用内容的快照 当时 ,因为延迟加载取决于它是通过数据上下文加载的。任何工具在整个模型中爬行寻找要加载的东西都是不可取的,因为这可能会无限期地持续下去,本质上会带来大量不需要的数据。

    选项:

    • 在序列化之前显式获取(通过“loadwith”预先获取,或通过点击适当的财产)您感兴趣的数据
    • 或者,将数据加载到 完全分离 用于序列化的DTO模型-在许多方面,这是对第一个模型的重新陈述,因为它将 必要时 包括迭代(投影)您想要的数据,但这意味着您正在创建DTO以适合您的确切形状 事实上 想要发送