従来の理由から、エンティティの代わりに を提供する 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>
クラスでこれらの属性を反映してデータ行を水和することでした。
誰かがこれを達成するためのより良い方法を持っていますか?