10

WCF サービスから関連データを取得し、Windows フォーム アプリケーション内で更新し、更新されたデータを WCF 経由でデータベースに永続化する n 層ソリューションを作成しました。アプリケーション、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 で動作するように更新されていないことがわかりました。特に、既存のデータは正常に更新されますが、新しいオブジェクトを混在させると例外がスローされます。

4

5 に答える 5

3

おそらく、Danny Simmons の EntityBag サンプルを見てください。

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

CatZ が言うように、.NET 4.0 では物事がずっと簡単になります。

私たちが支援するために計画していることの 1 つは、自己追跡が可能なクラスを生成する T4 テンプレートを作成することと、これらの自己追跡エンティティが ApplyChanges() に簡単に適用できるようにするための追加のサーフェスを作成することです。サーバー層に戻ったときのコンテキスト。

お役に立てれば

乾杯 Alex (Microsoft の Entity Framework チームの PM)。

于 2009-05-03T05:58:38.813 に答える
1

このスレッドは静かに続いているので、少し更新することができます...

ウィーイ!自己追跡エンティティがEF4に到着しました!

これをチェックしてください:

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/EF4
の新機能の発表。

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

楽しみ !

于 2009-10-27T15:15:41.360 に答える
1

Entity Framework 4 では、「ApplyCurrentValues」メソッドを使用して、切り離されたエンティティを更新できます。

あなたのシナリオでは、次のようになります。

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);
}

}

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

于 2011-03-09T09:49:53.603 に答える
0

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

于 2009-04-29T20:06:30.243 に答える