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 で動作するように更新されていないことがわかりました。特に、既存のデータは正常に更新されますが、新しいオブジェクトを混在させると例外がスローされます。