NHibernate长期存在问题,我通过非最佳方式/解决方法解决了这个问题。
首先,我正在使用WCF REST与我的客户端应用程序进行通信。如您所知,序列化持久化实体不是最佳实践,并且总是会导致其他问题。因此,我总是用NHibernates变形金刚将我的实体映射到DTO。问题是我有使用变形金刚转换它们更复杂的实体。
如何使用变换器或任何其他nhibernate功能将子实体映射到子dto?
注意:我不想使用第三方,例如 Automapper 。
这些是我要映射的实体和DTO。变量名彼此完全相同。
实体类:
的EntityType
public class crmEntityType : EntityModel<crmEntityType>
{
public crmEntityType()
{
Association = new List<crmEntityType>();
Fields = new List<crmCustomField>();
}
public virtual int ID { get; set; }
public virtual string Title { get; set; }
public virtual ICollection<crmEntityType> Associations { get; set; }
public virtual ICollection<crmCustomField> Fields { get; set; }
}
CustomFields
public class crmCustomField : EntityModel<crmCustomField>
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual crmEntityType EntityType { get; set; }
}
DTO的
EntityTypeDTO
[DataContract]
public class EntityTypeDTO
{
[DataMember]
public int ID { get; set; }
[DataMember]
public string Title { get; set; }
[DataMember]
public IList<CustomFieldDTO> Fields { get; set; }
[DataMember]
public int[] Associations { get; set; }
}
CustomFieldDTO
[DataContract]
public class CustomFieldDTO
{
[DataMember]
public int ID { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public int EntityType { get; set; }
[DataMember]
public int FieldType { get; set; }
}
答案 0 :(得分:1)
我通过花费我的日夜来找到我的解决方案。最后,我得到了我能找到的最佳解决方案。我希望有一天能帮助我的人。
此linq查询只使用一个数据库往返。我认为它将类映射到内存中。
return (from entityType in Provider.GetSession().Query<crmEntityType>()
.Fetch(x => x.Association)
.Fetch(x => x.Fields)
.AsEnumerable()
select new EntityTypeDTO()
{
ID = entityType.ID,
Title = entityType.Title,
Association = entityType.Association.Distinct()
.Select(asc => asc.ID).ToArray<int>(),
Fields = entityType.Fields.Distinct()
.Select(fi => new CustomFieldDTO
{ ID = fi.ID,
Name = fi.Name,
Value = fi.Value,
EntityType = fi.EntityType.ID,
Type = fi.Type
}).ToList()
}).ToList();