Entity Framework, WCF и обновления
-
03-07-2019 - |
Вопрос
Я создал 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.В частности, несмотря на успешное обновление существующих данных, при добавлении новых объектов возникают исключения.
Решение
У меня нет готового ответа для вашего конкретного сценария - это просто вопрос:проверяли ли вы ADO.NET Службы передачи данных (f.k.a."Астория")?
Они построены поверх Entity Framework, интерфейса RESTful WCF, и они предлагают взаимодействие на стороне клиента, плюс у них также, похоже, есть неплохая история не только для запросов, но и для обновления, вставки записей в базы данных.
Может ли это быть одним из вариантов?
Проверьте их на MSDN, в Блог Дэвида Хейдена, на Канал9, или посмотрите некоторые из превосходных сессий на СМЕШАЙТЕ 08 и ПЕРЕМЕШАЙТЕ 09
Марк
Другие советы
Вероятно, вам стоит взглянуть на образец EntityBag Дэнни Симмонса.
Он предназначен для упрощения подобных проблем:http://code.msdn.microsoft.com/entitybag/
Как говорит Катц, в .NET 4.0 все будет намного проще.
Одна из вещей, которые мы планируем сделать, чтобы помочь вам, - это создать для вас шаблон T4, который генерирует для вас классы, способные к самоотслеживанию, и некоторую дополнительную поверхность, чтобы этим самоотслеживающимся объектам было проще применять CHANG() к контексту, когда они возвращаются на уровень сервера.
Надеюсь, это поможет
Приветствия Алекс (руководитель группы Entity Framework в Microsoft).
Я вижу, что за этой темой тихо следят, поэтому я позволяю себе сделать небольшое обновление...
Вееееее !Объекты самослеживания прибыли в EF 4!
Посмотри на это:
http://blogs.msdn.com/efdesign/archive/2009/03/24/self-tracking-entities-in-the-entity-framework.aspx
Объяснение механизма самоконтроля командой entity framework.
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-уровневых шаблонов для несвязанных объектов.
Наслаждайтесь !
В 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);
}
}
Я надеюсь, что это будет полезно
Одним из ограничений Entity Framework версии0 является обновление сущностей.К сожалению, я думаю, что вам не повезло, пока не появится версия 2.