Entity Framework, WCF и обновления
Я создал 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. В частности, пока он будет успешно обновлять существующие данные, исключения генерируются при смешивании в новых объектах.
Ответы
Ответ 1
У меня нет готового ответа для вашего конкретного сценария, но только вопрос: вы проверили ADO.NET Data Services (f.k.a. "Astoria" )?
Они построены поверх Entity Framework, интерфейса WCF RESTful, и они предлагают клиентский опыт, а также, похоже, они имеют достойную историю не только для запросов, но и для обновления, вставки записей в базы данных.
Это может быть вариант?
Проверьте их на MSDN, на Дэвид Хейден блог, на Channel9 или посмотреть некоторые из превосходных сессий в MIX08 и MIX 09
Марк
Ответ 2
Вероятно, вам следует взглянуть на образец EntityBag Дэнни Симмонса.
Он предназначен для упрощения таких проблем:
http://code.msdn.microsoft.com/entitybag/
Поскольку CatZ говорит, что в .NET 4.0 все будет намного проще.
Одна из вещей, которую мы планируем сделать, - это создать для вас шаблон T4, который генерирует для вас классы, способные самостоятельно отслеживать, и некоторую дополнительную поверхность, чтобы упростить эти самонаблюдающие объекты ApplyChanges() в контексте, когда они возвращаются к уровню сервера.
Надеюсь, что это поможет
Приветствия
Алекс (PM в команде Entity Framework в Microsoft).
Ответ 3
Я вижу, что этот поток тихий, поэтому я позволяю себе немного обновить...
Уайее!
Объекты самоконтроля прибыли в EF 4!
Проверьте это:
http://blogs.msdn.com/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx
Объяснение механизма самопроверки командой фреймворка сущности.
http://aleembawany.com/2009/05/17/new-features-in-entity-framework-40-v2/
Анонс новых функций в EF 4.
http://msdn.microsoft.com/en-us/magazine/ee321569.aspx
Сравнение нескольких шаблонов N-уровня для отключенных объектов.
Наслаждайтесь!
Ответ 4
В Entity Framewrok 4 вы можете использовать метод ApplyCurrentValues для обновления отдельного объекта.
В вашем сценарии будет что-то вроде этого:
this.ProductEntities.Product.ApplyCurrentValues(product);
foreach (Track track in product.Tracks.ToList()) {
if (track.EntityKey != null)
{
//Update Entity
this.ProductEntities.Track.ApplyCurrentValues(track);
}
else
{
//New Entity
this.ProductEntities.Track.Attach(track);
}
}
Надеюсь, это будет полезно
Ответ 5
Одним из ограничений Entity Framework v1.0 является обновление сущностей. К сожалению, я думаю, что вам не повезло, пока не придет вторая версия.