![](/img/trans.png)
[英]Converting a DTO's entityID to a Domain's entity through NHibernate and AutoMapper
[英]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.