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