0

NHibernate には長い間問題があり、最適ではない方法/回避策で解決しました。

まず、クライアント アプリケーションとの通信に WCF REST を使用しています。ご存知のように、永続化されたエンティティをシリアル化することはベスト プラクティスではなく、常に他の問題を引き起こします。したがって、私は常に NHibernates Transformer を使用してエンティティを DTO にマップします。問題は、トランスフォーマーを使用して変換するのがより複雑なエンティティがあることです。

トランスフォーマーまたはその他の nhibernate 機能を使用して、サブエンティティをサブ 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; }
}

カスタムフィールドDTO

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

}
4

1 に答える 1

1

昼夜を問わず解決策を見つけました。最後に、私が見つけることができる最善の解決策を見つけました。いつか私の状態の誰かを助けることを願っています。

この linq クエリは、1 回のデータベース ラウンドトリップで動作します。クラスをメモリにマップすると思います。

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();
于 2012-12-08T00:33:41.193 に答える