5

EFコードファーストコンテキストで使用しているPOCOオブジェクトがいくつかあります。したがって、データを入力するときは、POCO自体ではなく、実際にはEFプロキシオブジェクトを処理しています。

クライアントアプリケーションで使用するPOCOオブジェクトを返すASP.NETMVC4ApiControllerがあります。

私の「GET」メソッドは次のようになります。

    // GET api/Clients/5
    public Client GetClient(int id)
    {
        Client client = db.Clients.Find(id);
        if (client == null)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
        }

        return client;
    }

シリアライザーがClientオブジェクトをシリアル化しようとすると、実際にはEFプロキシバージョンを処理しているため、実際には機能しません。これにより、問題が発生します。ApiControllerが他のオブジェクトのコレクションとともにオブジェクトを返すことができますか?を参照してください。

だから、私はこれを自分に行うことでプロキシ生成をオフにすることができますDbContext

    db.Configuration.ProxyCreationEnabled = false;

これにより、プロキシではなくPOCOを処理していることが保証されます。ただし、クライアントクラスのメンバーのほとんどは、遅延読み込みを行っていたEFプロキシであったため、入力されていません。

したがって、私が本当に望んでいるのは、EFプロキシクラスを使用してデータを取得し、最後にメソッドから元のPOCOを返すことです。

コードでオブジェクト全体(ネストされたオブジェクトを含む)を最初から手動で作成せずに、これを行うにはどうすればよいですか?確かに簡単な方法があるはずです-または少なくともある種のヘルパークラス?

4

2 に答える 2

3

あなたの質問は、アプリケーションのアーキテクチャを設計する方法に関するものです。技術的には、1 つのアプリケーションに複数のモデルがあります。ドメイン モデル、データ転送オブジェクト、またはさまざまなレイヤーのビュー モデル (ビジネス ロジック レイヤー、ディストリビューション レイヤー、プレゼンテーション レイヤー) です。

ASP.NET MVC でのモデルの誤用。(EF からの) ドメイン モデルをビュー モデルとして使用することがよくあります。場合によっては、ビュー モデルとしてのドメイン モデルが UI にとって十分であることが正しいからです。しかし実際には、複雑な UI (例: グリッド) ではまったく異なります。UI にデータを提供するために、1 つのビュー モデルに結合するために複数のドメイン モデルが必要になる場合があります。

ディストリビューション レイヤー、asp.net Web API と同様に、消費者は何かを行うために複数のドメイン モデルを必要とする場合があります。通常、データ転送対象として 100% ドメイン モデルではありません。

したがって、問題を分離するために、DTO オブジェクトをドメイン オブジェクト (EF の POCO オブジェクト) で作成して分離することをお勧めします。これは、プロパティで 1 : 1 にマップされます。

たとえば、Customer ドメイン モデルがある場合は、CustomerDto が必要です。

手動でマッピングするか、 AutoMapperなどのツールを使用して、ドメイン モデルを DTO モデルにマッピングできます。

このようにして、問題を回避することもできます。

于 2012-08-01T15:29:31.527 に答える
1

私はあなたが答えを得たことを知っていましたが、これを見たいと思うかもしれません:

DataContractSerializer シリアル化エンジンは既知の型のみをシリアル化および逆シリアル化できるため、POCO プロキシ型を Windows Communication Foundation (WCF) で直接シリアル化または逆シリアル化することはできません。プロキシ タイプは既知のタイプではありません。詳細については、「POCO エンティティの操作」トピックの「POCO プロキシのシリアル化」セクションを参照してください。POCO プロキシを POCO エンティティとしてシリアル化するには、ProxyDataContractResolver クラスを使用して、シリアル化中にプロキシ タイプを POCO タイプにマップします。

http://msdn.microsoft.com/en-us/library/vstudio/ee705457(v=vs.100).aspx

于 2013-12-17T11:35:16.950 に答える