フロントエンドでMVP(Model View Presenter)を使用し、バックエンドでWCFサービスを使用して小さなn層Webアプリケーションをセットアップしました。これは、EF4.0と通信するDALの背後にあるBLLと通信します。 。これはすべて非常にうまく機能しています。すべて機能するいくつかのGetメソッドとAddメソッドを作成しました。ここで、いくつかのUpdateメソッドを作成したいと思いました。EF4.0のSelf-TrackingEntities(STE)を使用しているので、すべてがうまく機能し、実装はかなり簡単だと思いました。
これは当てはまらないようです。Webフロントエンドでアイテムを変更すると、WCFサービスに戻ったときにステータスが[変更されていません]のままになります。エンティティは変更されていないため、データベースでは何も更新されません。SOに関するこの質問を通じて:EF 4自己追跡エンティティが期待どおりに機能しない n層アプリケーションでのSTEの実装について、より詳細に説明している記事に出くわしました。(http://msdn.microsoft.com/en-us/magazine/ee335715.aspx)引用:
自己追跡エンティティテンプレートで生成されたエンティティコードをクライアントで再利用するようにしてください。 Visual Studioまたはその他のツールで[サービス参照の追加]によって生成されたプロキシコードを使用する場合、ほとんどの場合は正しく見えますが、エンティティが実際にクライアントでの変更を追跡していないことがわかります。
さて、私はこのコードを使用してサービスへのクライアントを作成することができました:
var svc = new ChannelFactory<INorthwindSTEService>(
"INorthwindSTEService")
.CreateChannel();
これはまったく問題なく機能しているようです。重要なのは、クライアントでシリアル化されたエンティティを取得するにはどうすればよいですか?コード例では、ライターが次のコードを使用していることがわかります。
var products = new List<Product>(svc.GetProducts());
var customer = svc.GetCustomer("ALFKI");
しかし、私はそれらのオブジェクト/エンティティ/???がどこにあるのかわかりません。定義されている(私は顧客と製品について話している)
Add Service Referenceを使用して作成されたエンティティを使用してテストしましたが、機能していないようです。返されたエンティティのステータスはまだ変更されていません。
フロントエンドでEFエンティティを参照したくないのは、EFエンティティを分離したままにし、フロントエンドにシリアル化されたオブジェクトのみを配置したいからです。しかし、それが本当に必要な場合、私はそれをしなければならないかもしれません。
ああ、MarkAsModified()
エンティティオブジェクトでメソッドを使用することはうまく機能しますが、エンティティが自分のステータスを自分でチェックする必要があるため、これはハックのようなものです。
続行する方法について何かアドバイスはありますか?私の推測では、このMarkAsModiefied()
メソッドを使用するか、Webアプリケーションでエンティティモデルプロジェクトを参照することは実行可能な回避策になる可能性がありますが、もっと良いことがあれば、最初にそれを試してみたいと思います。