WCF、Entity Frameworkおよびデータ契約

datacontract entity-framework wcf

質問

VS 2008および.NET 3.5 SP1を使用している場合

クライアントがEntity Frameworkを使用してデータベースエントリを読み書きするサービスに接続できるようにするために、WCFを使用しています。デフォルトでは、データベースから自動的に生成されたエンティティにはDataContract属性が適用されています。

残念ながら、公開されているフィールドの多くはクライアントによる消費(つまり、誰がどのデータにアクセスしているかの記録など)を意図したものではありません。 Entity Frameworkクラスがこの方法で公開されないようにする方法はありますか?

:これは.NETエンティティのプライベートプロパティがサービスを介してパブリックとして公開されるのを防ぐ方法の複製ではありませんか。 。その質問では、ユーザーは特定のフィールドを選択的に表示することを望みますが、私はエンティティがDataContractとしてまったく公開されないことを望みます。

前もって感謝します。

受け入れられた回答

あなたのエンティティはデータベースと1対1で対応する必要がないことを知っていますか?特に、関連性のない列やテーブル全体を除外することができます。

エンティティモデルは概念モデルであることを意図しています。 1つのクライアントセット(Webサービスなど)に公開するためのエンティティセットと、同じデータベースにマッピングする別のセット(異なるクライアント(Webアプリケーションなど)用)を簡単に作成できます。

一方、Webサービスを通じてEntity Frameworkのオブジェクトを公開しないことを常にお勧めします。 Microsoftは残念ながら[DataMember]のマークを付けて実装依存のプロパティを公開しています。私は今、AdventureWorksからSalesOrderHeaderを返す単純なサービスでこれを試しました。私のクライアントは、次のEFタイプのプロキシバージョンを受け取りました。

  • EntityKeyMember
  • StructuralObject
  • EntityObject
  • EntityKey
  • EntityReference
  • 関連終了

これらはあなたのクライアントが知る必要があるものではありません。

データ転送オブジェクトを公開し、プロパティを一方から他方にコピーすることをお勧めします。明らかに、これは手作業によるよりもリフレクションまたはコード生成を通して行われる方が良いです。私は過去にコード生成を通してそれをやった(T4テンプレート)。

私が試したことがないオプションはAutoMapperです。


人気のある回答

DataContractオブジェクトには別々のクラスを使用します。 ToContract()という1つのメソッドを持つインターフェイスがあり、すべてのエンティティはこのインターフェイスを部分クラスファイルに実装しています。これは余分な作業であり、定型的ですが、必要な制御の分離と細分性を得るための最も簡単な方法のようです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ