【问题标题】:Automapper + DTO with an NHibernate ProxyAutomapper + DTO 和 NHibernate 代理
【发布时间】:2014-01-27 17:16:43
【问题描述】:

我在以下配置中使用 AutoMapper 将对象从 Nhibernate 查询转换为我的 DTO 时遇到困难

假设我有 4 节课。

    class A
{
    //some fields of built-in type
}
abstract class B //Some class derived this one, but this is not important here
{
    //some fields of built-in type
    public A refA { get; set; }
}
class C
{
    //some fields of built-in type
    public B refB { get; set; }
}
class D
{
    //some fields of built-in type
    public B refC { get; set; }
}

我使用 AutoMapper 将其转换为我的 DTO,为了简单起见,这里假设 DTO 是这些类的精确副本。 我想通过wire发送这个,所以在序列化之前,我要求AutoMapper将它转换为D-Class对应的DTO。

如果我制作这些对象并自己配置字段,当我调用时

Mapper.Map<T1,T2>(T1 source)

这是有效的。所以我的配置 AutoMap 正在工作。更多它也与

Mapper.Map<IList<T1>,List<T2>

很好。

现在我制作这些对象,将它们放入数据库中,并使用 Nhibernate 向我的 SQL DB 调用请求以检索 IList(D 类列表)。

如果我现在尝试在 DTO 中转换它,它就不再起作用了。 我在 AutoMap 中跟踪代码,它正确映射了 class D 中的所有内置类型字段,然后它来到了 refC,在这里它在某个地方崩溃了。

我知道延迟加载以及 Nhibernate 只是给我一个 C 类引用的代理,但我不知道如何解决这个问题。 让您知道NHibernateUtil.IsInitialized(refC) is true

非常感谢

【问题讨论】:

  • 我使用了这个 SO 帖子:stackoverflow.com/questions/11816732/… 并查看了 github 上发布的罗马人(在第一个答案的 cmets 中:github.com/RomansWorks)我改进了他的代码以适合我更一般的情况.如果有人感兴趣,请问我。它使用 ValueInjecter 来解析映射,几乎不需要配置(都是 generic-reflec)。

标签: c# nhibernate automapper


【解决方案1】:

在将实体传递给自动映射器之前,您必须取消代理。这与运行 Json 序列化基本相同。

你可以使用

Session.GetSessionImplementation().PersistenceContext.Unproxy();

取消代理。

或者你禁用延迟加载。

或者您不使用自动映射器而是使用标准转换...例如

.Query().Select(p => new SomeDto(){ PropA = p.PropA, ...});

【讨论】:

  • 我无法禁用延迟加载,因为我的 DTO 不包含每个类包含的大量元素列表。我只想要一些字段,所以如果我禁用它,它将加载所有这些无用的列表。我不喜欢非代理方式,因为它不喜欢延迟加载,而且我必须传递会话。所以我想我会自己开始硬编码。
【解决方案2】:

您也可以使用其他标准方式:

resultSet = session.CreateCriteria(typeof(DataObject))
    .Add(query criteria, etc.)
    .SetResultTransformer(Transformers.AliasToBean<DTOObject>())
    .List<IDTOObject>()

基本上你不必迭代所有的道具。 DTO 和数据对象之间的所有类道具都相同就足够了。

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多