Я создал n-уровневое решение, в котором я получаю связанные данные из службы WCF, обновляю их в приложении Windows Forms и затем возвращаю обновленные данные через 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. В частности, при успешном обновлении существующих исключений данных генерируются при добавлении новых объектов.