我创建了一个n层解决方案,我从WCF服务中检索相关数据,在Windows窗体应用程序中更新它,然后通过WCF返回更新后的数据以保存到数据库。应用程序,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();
}
这些更新由客户端应用程序可以,以及更新现有的内容,还插入其他“音轨”对象被施加。
当我收到的产品对象返回客户端应用程序,我可以正确地看到所有更新,但为了保存所有的变化正确地我有过几个跳火圈......
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一起使用。特别是,虽然它会成功更新现有的数据异常,但在混合新对象时会抛出异常。
这可能是东西,我应该看看,但至今我还没有。不幸的是,我们最近才开始在我工作的地方使用EF&WCF,而Astoria目前仅仅是要进行调查的新技术列表中的另一项目。谢谢。 – 2009-05-07 17:46:14
我终于看到了这个(主要是因为我开始玩SilverLight),实际上,我认为这是我正在寻找的答案。 – 2009-08-20 11:50:25