1

従来の理由から、エンティティの代わりに を提供する ASMX Web サービスを呼び出してDataTableから、データ テーブルを Web サービスに戻す必要があります。ここではエンティティという用語を使用していますが、データ層全体 (CRUD) はこれらの Web サービスによって実行されるため、ORM はありません。データ テーブルを提供する Web メソッドを呼び出し、このデータ テーブルをエンティティに変換し、エンティティを更新し、データ テーブルに変換してから、最後にこのデータ テーブルを Web メソッドに渡します。

現時点では、AutoMapper を使用して、データ テーブルの行からエンティティに変換していますProfile

Mapper.CreateMap<DataRow, MyEntity>()
    .ForMember(d => d.Property, o => o.MapFrom(s => s["property_column"]))
    // and so on

これは完全に正常に機能しますが、エンティティをデータ テーブルの行に戻すためにやりたかったことはProfile、これを使用することでした(残念ながら機能しません)。

Mapper.CreateMap<MyEntity, DataRow>()
    .ForMember(d => d["property_column"], o => o.MapFrom(s => s.Property))
    // and so on

したがって、AutoMapper はこれを行うことができないため、リフレクションを使用する必要があると思いますが、これにより別の問題が発生します。エンティティ プロパティ名がデータ行の列名と一致しません。だから私は単純にできませんDataRow[PropertyInfo.Name] = value

プロパティをターゲット列にマップするために(エンティティごとに)クラスを使用することを考えてEntityTypeConfigurationいましたが、これはプロジェクト内でEntity Frameworkへの参照が必要になることを意味します-そうではないので避けたいものです使用済み。私の 2 番目の (そして好ましい) 考えは、ターゲット列名を含むエンティティのカスタム属性を作成し、ConvertToDataTable<T>クラスでこれらの属性を反映してデータ行を水和することでした。

誰かがこれを達成するためのより良い方法を持っていますか?

4

1 に答える 1

1

この質問につまずいた人の利益のために、ITypeConverter契約に従ってカスタム AutoMapper コンバーターを作成することになりました。現時点では、エンティティ タイプごとにカスタム コンバーターを作成しているので、私の例MyEntityでは次のようにします。

public class MyEntityToDataTableConvertor : ITypeConvertor<MyEntity, DataTable>
{
    public DataTable Convert(ResolutionContext context)
    {
        MyEntity myEntity = (MyEntity)context.SourceValue;
        DataTable dt = GetDataTableSchema();
        DataRow nr = dt.NewRow();
        nr["property_column"] = myEntity.Property;
        // and so on
        return dt;
    }
}

次に、AutoMapper に次のように指示しConvertUsingます。

Mapper.CreateMap<MyEntity, DataTable>()
      .ConvertUsing(new MyEntityToDataTableConvertor ());

リフレクションとジェネリックを使用するためにこれをたくさんリファクタリングできると確信していますが、短期的にはこれはうまく機能しています。

于 2013-02-15T16:03:43.560 に答える