【问题标题】:Lite version of existing class现有类的精简版
【发布时间】:2012-12-12 01:17:28
【问题描述】:

我有一个类A,其中包含一个类B 的集合。最后一堂课非常繁重,对于我正在研究的新模块,我只需要其中的几个字段。

为了提高使用 nhibernate 从 SQL Server 加载实体时的性能,我想创建这个类的精简版,以便在我正在开发的这个模块中使用(类 BLite)。

这个BLite 类将用于集合和多对一关系。我知道我可以为这个只包含我需要的字段的新类创建一个单独的映射,但如果可能的话,我想避免这种情况(使用组件或类似功能)。

是否可以在不创建额外映射的情况下使用“精简版”类?

【问题讨论】:

  • 你是不是在完成这个问题之前不小心发布了这个问题?它不包含实际问题。
  • 也许一些 DTO 可以帮助你。您不需要映射此对象,您可以创建查询来获取此类型。看这里:stackoverflow.com/questions/1530345/…
  • 您可以将所有必填字段(在精简版和重型版中)移动到精简版并从中继承: public class BLite { public string Name { get;放; } } 公共类 B : BLite { 公共字符串 OtherProperty { 获取;放;我不确定 NHibernate 是如何处理继承的,但也许它会有所帮助。
  • 您是要使用灯光类执行插入和更新还是只读取?

标签: c# nhibernate


【解决方案1】:

您可以将AutoMapper 用于相同目的。 (需要定义 lite 类,并为 AutoMapper 指定地图)

使用流畅的界面,您可以仅包含/排除特定字段。

Example

【讨论】:

  • 我的目标是提高使用 nhibernate 从 sql 加载实体的性能,并没有深入了解 automapper 将如何提供帮助。在项目的这个阶段无法移动到流畅的界面。
【解决方案2】:

这是 Automapper 的替代品,我发现它更易于使用 http://valueinjecter.codeplex.com/

这里有一个比较AutoMapper vs ValueInjecter

无论如何,创建重类的简单或轻量版本的最简单方法可能是使用映射器

【讨论】:

  • 我的目标是提高使用 nhibernate 从 sql 加载实体的性能,没有深入研究,但不确定 automapper 或 valueinjecter 将如何提供帮助
  • 也许你是对的。我对 NHibernate 不是很熟悉。但是,我有一些非常繁重的课程,我需要使用两个字段之一。我使用 ValueInjector 来填充一个新的 lite 类(实际上是 DTO),做一些工作并将字段发回。如果这不是您想要做的,或者如果您无法控制实例化 lite 类,那么我想这些将无济于事
【解决方案3】:

对您的方案有帮助的是lazy 属性映射,文档5.1.9. property 第 9 点):

lazy(可选 - 默认为 false):指定此属性是 懒惰的。初始对象时不加载惰性属性 加载,除非在特定查询中覆盖了获取模式。 延迟属性的值会在 对象被访问。

这种映射可能适合您,因为这些属性在需要时可用(当对象连接到会话时),但从不隐式加载。在查询中,提取模式仍然可以调整(作为一个 SELECT 子句的一部分)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多