Entity Framework、WCF&更新
-
03-07-2019 - |
質問
WCFサービスから関連データを取得し、Windows Formsアプリケーション内で更新してから、更新されたデータを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で動作するように更新されていないことがわかりました。特に、既存のデータは正常に更新されますが、新しいオブジェクトを混在させると例外がスローされます。
解決
特定のシナリオに対する既成の答えはありません-ただ質問:ADO.NET Data Services(f.k.a." Astoria")をチェックアウトしましたか?
これらは、WCFのRESTfulインターフェイスであるEntity Frameworkの上に構築されており、クライアント側のエクスペリエンスを提供します。さらに、クエリだけでなく、データベースへのレコードの挿入についてもまともなストーリーを持っているようです。
これはオプションですか?
MSDN の David Haydenのブログ、 Channel9 、または一部の優れた MIX08およびMIX 09
のセッションマーク
他のヒント
おそらく、Danny SimmonsのEntityBagサンプルをご覧ください。
これらの種類の問題を簡素化するように設計されています。 http://code.msdn.microsoft.com/entitybag/
CatZによると、.NET 4.0の方がはるかに簡単だという。
私たちが支援することを計画していることの1つは、自己追跡可能なクラスを生成するT4テンプレートを作成することと、これらの自己追跡エンティティがApplyChangesを簡単にするための追加の表面です()サーバー層に戻ったときにコンテキストに。
これが役立つことを願って
乾杯 アレックス(マイクロソフトのEntity FrameworkチームのPM)。
このスレッドは静かであることがわかりましたので、少し更新することができます...
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層パターンの比較。
お楽しみください!
Entity Framewrok 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);
}
}
それが役立つことを願っています
Entity Framework v1.0の制限の1つは、エンティティの更新です。残念ながら、バージョン2が登場するまでは運が悪いと思います。