【问题标题】:Serializing DTO's over WCF通过 WCF 序列化 DTO
【发布时间】:2012-12-07 13:59:25
【问题描述】:

我在很长一段时间内都遇到了 NHibernate 的问题,我通过非最佳方式/解决方法解决了这个问题。

首先,我使用 WCF REST 与我的客户端应用程序进行通信。如您所知,序列化持久化实体并不是最佳实践,而且总是会导致其他问题。因此,我总是使用 NHibernates Transformers 将我的实体映射到 DTO。问题是我有更复杂的实体,使用 Transformer 来转换它们。

如何使用转换器或任何其他休眠功能将子实体映射到子 dto?

注意:我不想使用像 Automapper 这样的第三方。

这些是我要映射的实体和 DTO。变量名完全相同。

实体类:

实体类型

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; }

}

自定义字段

    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; }

}

【问题讨论】:

标签: wcf hibernate nhibernate serialization dto


【解决方案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();

【讨论】:

    猜你喜欢
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    相关资源
    最近更新 更多