2012-12-07 44 views
0

我有一個很長時間的NHibernate的問題,我解決了非最佳的方式/解決方法。序列化DTO的WCF

首先,我使用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

我編輯了你的標題。請參見「[應的問題包括‘標籤’,在他們的頭銜?(http://meta.stackexchange.com/questions/19190/)」,這裏的共識是「不,他們不應該」。 –

+0

好的,很抱歉,謝謝你糾正它。 :) – iboware

回答

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();