2009-04-29 11 views
10

WCFサービスから関連データを取得し、Windowsフォームアプリケーション内で更新し、更新されたデータをWCF経由でデータベースに保存するためのn-tierソリューションを作成しました。アプリケーション、WCFサービス、データベースはすべて異なるマシン上にあります。エンティティフレームワーク、WCFおよび更新

取得されるデータは、オブジェクトと子オブジェクトで構成されてい...

public Product Select(string catalogueNumber) { 

    return (from p in this.ProductEntities.Products.Include(@"Tracks") 
      where p.vcCatalogueNumber == catalogueNumber 
      select p).FirstOrDefault() ?? new Product(); 
} 

クライアントアプリケーションによって適用されたアップデートができるだけでなく、既存のコンテンツを更新し、また、追加の「トラック」オブジェクトを挿入します。

私は、クライアントアプリケーションからバックProductオブジェクトを受け取ったとき、私はしかし、私はいくつかのフープを介してジャンプする必要が正常にすべての変更を保存するためには、正しくアップデートのすべてを見ることができます...

public void Save(Product product) { 

    Product original = this.Select(product.vcCatalogueNumber); 
    if (original.EntityKey != null) { 

     this.ProductEntities.ApplyPropertyChanges(product.EntityKey.EntitySetName, product); 

     // There must be a better way to sort out the child objects... 
     foreach (Track track in product.Tracks.ToList()) { 

      if (track.EntityKey == null) { 
       original.Tracks.Add(track); 
      } 
      else { 
       this.ProductEntities.ApplyPropertyChanges(track.EntityKey.EntitySetName, track); 
      } 

     } 

    } 
    else { 

     this.ProductEntities.AddToProducts(product); 

    } 

    this.ProductEntities.SaveChanges(); 

} 

確かに、これを行う簡単な方法がありますか?

注:午後にはEntityBagプロジェクトの調査に尽力しましたが、EF RTMで動作するように更新されていないことがわかりました。特に、既存のデータを正常に更新する間に、新しいオブジェクトで混合するときに例外がスローされます。

答えて

3

私はあなたの特定のシナリオの既成の答えを持っていませんが、ちょうど質問です:ADO.NET Data Services(f.k.a. "Astoria")をチェックアウトしましたか?

これらは、WCFのRESTfulインターフェイスであるEntity Frameworkの上に構築されており、クライアント側のエクスペリエンスを提供します。また、クエリーだけでなく、レコードをデータベースに挿入するためのまともな話もあります。

これはオプションですか?

マークをChannel9に、David Hayden's blogで、MSDN上でそれらをチェックアウト、またはMIX08 and MIX 09

で優れたセッションのいくつかを見る

+0

役に立つことを願っています

this.ProductEntities.Product.ApplyCurrentValues(product); foreach (Track track in product.Tracks.ToList()) { if (track.EntityKey != null) { //Update Entity this.ProductEntities.Track.ApplyCurrentValues(track); } else { //New Entity this.ProductEntities.Track.Attach(track); } 

}

:あなたのシナリオでは

はこのようなものになります。残念ながら、私は最近EF&WCFの使用を開始しましたが、Astoriaは現在、調査対象となる新技術のリストの別の項目です。ありがとう。 –

+0

私は最終的に(これは主に私がSilverLightで遊んでいたために)これを見て回っていましたが、実際はそれが私が探していた答えだと思います。 –

0

Entity Framework v1.0の制限の1つは、エンティティの更新です。残念ながら、バージョン2が到着するまであなたは運がないと思います。

3

おそらくダニー・シモンズEntityBagサンプルを見てみる必要があります。

問題のこれらの種類を簡素化するために設計されています http://code.msdn.microsoft.com/entitybag/

CATZは、物事は、.NET 4.0で非常に簡単になります言うように。

私たちが手助けしようとしていることの1つは、セルフトラッキングが可能なクラスを生成するT4テンプレートを作成することです。クライアントがサーバー層に戻るときに、コンテキストにApplyChanges()を適用します。

希望これは

乾杯 アレックス(MicrosoftのEntity FrameworkのチームのPM)を支援します。

+0

ええ、あなたは私がちょうど言ったことを男に伝えるために+2票を得る! :) – mhenrixon

+0

私はalredyがEntityBagを試して、それが私が望んだことをしないことを発見しました。 Googleの結果によると、EntityBagはEF/RTMでは動作しませんが、間違っている可能性があります。どちらの方法でも、親オブジェクトを更新しようとすると多くの例外が発生します子オブジェクトコレクションとにかくありがとうございます。 –

1

私はこのスレッドは静かなので、私は少し更新をすることができます...

Weeeeee! セルフトラッキングエンティティがEF 4に到着しました!

http://blogs.msdn.com/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx
エンティティフレームワークチームによる自己追跡メカニズムの説明:このうち

を確認します。

http://aleembawany.com/2009/05/17/new-features-in-entity-framework-40-v2/


EF 4の新機能のアナウンス

http://msdn.microsoft.com/en-us/magazine/ee321569.aspx
切断エンティティのためのいくつかのN層のパターンの比較。

お楽しみください!

1

Entity Framewrok 4では、メソッド "ApplyCurrentValues"を使用して、分離されたエンティティを更新できます。私はそれがこれはおそらく私がに見なければならないものですが、まだ私は持っていない

関連する問題