繁体   English   中英

具有NHibernate代理的Automapper + DTO

[英]Automapper + DTO with an NHibernate Proxy

我在以下conf中使用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是这些类的精确副本。 我想通过电线发送它,因此在序列化之前,我要求AutoMapper将其转换为D类对应的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

非常感谢

您必须先取消代理您的实体,然后再将其传递给自动映射器。 这与运行Json序列化基本上是相同的问题。

您可以使用

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

取消代理。

或者您禁用延迟加载。

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

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

您还可以使用另一种标准方式:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM