2

LINQ to SQL エンティティから派生した親オブジェクトと子オブジェクトがあります。これらをいくつかのドメインフレンドリーな DTO にマップしたいと考えています。私の SQL エンティティ クラスは次のようになります。

public class SqlEntityParent
{
    public int ParentId { get; set; }
    public string Name { get; set; }
    public EntitySet<SqlEntityChild> Children { get; set; }
}

public class SqlEntityChild
{
    public int ChildId { get; set; }
    public int ParentId { get; set; }
    public int Position { get; set; }
    public string CategoryName { get; set; }
    public string CategoryValue { get; set; }
}

SqlEntityParentこのモデルでは、との間の標準的な 1 対多の関係SqlEntityChildです。いくつかの代表的なデータは...

親:

親 ID 名
 -------- -------
 1 親 1

子:

ChildId ParentId 位置 CategoryName CategoryValue
------- -------- -------- ------------ -------------
1 1 1 内容 モノ
2 1 1 グループ グループワン
3 1 2 内容 モノ
4 1 2 グループ グループツー

次に、これらのデータを次のようなドメイン オブジェクトにマップします。

public class DomainParent
{
    public int ParentId { get; set; }
    public string Name { get; set; }
    public List<DomainChild> Children { get; set; }
}

public class DomainChild
{
    public int Position { get; set; }
    public string Contents { get; set; }
    public string Group { get; set; }
}

この構造では、1 つのDomainChildオブジェクトが 2 つのオブジェクトのデータで構成されSqlEntityChild、グループ化はPosition子エンティティの値によって決定されます。したがって、これらのサンプル データは、 2 つのオブジェクトDomainParentのリストを持つ1 つのオブジェクトを表しDomainChildます。最初の子にはPosition、1 のContents値、"Things" のGroup値、および "GroupOne" の値が必要です。2 番目の子にはPosition、2 の 、Contents「Things」の 、およびGroup「GroupTwo」の が必要です。

ValueResolvers を使用して AutoMapper で 1 対 1 のカスタム マッピングを設定することに満足していますが、これを処理する最善の方法がわかりません。以下のリゾルバーと、1 回のパスで子エンティティのリスト全体をマップする親エンティティの関連付けられたマッピングを作成しましたが、このリゾルバー クラスで子オブジェクトのマッピング全体を手動で行う必要があるため、間抜けに思えます。

Mapper.CreateMap<SqlEntityParent, DomainParent>()
    .ForMember(dto => dto.Children, opt => opt.ResolveUsing<MyResolver>());


public class MyResolver: ValueResolver<SqlEntityParent, List<DomainChild>>
{
    private MyDataContext db;

    public MyResolver()
    {
        db = new MyDataContext();
    }

    protected override List<DomainChild> ResolveCore(SqlEntityParent source)
    {
        // In here:
        //   1. custom LINQ queries
        //   2. manual creation of DomainChild objects
        //   3. manual mapping of SqlEntityChild to DomainChild
    }
}

ですから、私の主な質問は次のとおりです。これは、この状況で AutoMapper を使用して実行できる最善の方法ですか、それとも他に使用できるより効果的な方法はありますか?

4

1 に答える 1

0

通常、これらの場合、リスト、配列などが自動的にサポートされるため、SqlEntityChild から DomainChild に直接マップします。元の Children コレクションを反復処理する以外に追加のロジックがないことを考えると、要素タイプのマッピングを設定するだけで済みます。

于 2010-02-18T18:08:23.050 に答える