0

アプリケーションに OData インターフェイスを提供したいと考えています。私が見た例では、EF を使用して LINQ クエリを SQL クエリにマップしています。

私見ですが、このアプローチは物理データベース モデルを世界に公開します (EF/NH がある程度の柔軟性を提供することは知っていますが、制限があります)。

私ができるようにしたいのは、次のとおりです。

  1. いくつかの DTO を介してデータ コントラクトを定義します。
  2. ユーザーがデータ コントラクト Dtos に対してクエリを実行できるようにする OData サービスを用意します。
  3. DTO を介したクエリを、たとえば EF モデルまたは NH を介したクエリに変換するための変換レイヤーを用意します。
  4. 翻訳されたクエリを実行します。
  5. 結果をデータ コントラクトにマップします。

私は気が狂っていますか、それともこの問題の解決策はありますか?

4

2 に答える 2

0

「契約」モデルと「持続」モデルの 2 つのモデルがあります。永続化されたモデルは、Entity Framework がマップされるものです。IQueryable を返す Get メソッドは、次のような IQueryable を返します。

return dbContext.PersistedCustomers.Select(x => new Customer(Name = x.OtherName, ...));

少なくとも ObjectContext ではなく DbContext を使用する場合、コントラクト モデルに基づく Where 基準は、データベースに対して実行される PersistedModel の Where 基準に自動的に変換されます。うまくいけば、この 2 つの違いはそれほど複雑ではないため、奇妙なデータ マッサージが必要になることはありません。逆転には限界があると思います。

于 2013-01-15T15:35:37.127 に答える
0

これを行う 1 つの方法は、モデルを表す ViewModel を作成し、AutoMapperを使用してそれらの間をマッピングすることです。次のように使用できます。

   var address = _Context.Addresses.Where(p => p.AddressID == addressID).Single();
   AddressVM result = Mapper.Map<AddressVM>(address);
于 2013-01-15T15:38:36.950 に答える