我创建了一个 n 层解决方案,我从 WCF 服务检索相关数据,在 Windows 窗体应用程序中更新它,然后通过 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 一起使用。特别是,虽然它会成功更新现有数据,但在混合新对象时会引发异常。