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();
}
обновления, применяемые клиентским приложением, могут, а также обновление существующих содержание, также вставьте дополнительные объекты "Track".
когда я получаю объект продукта обратно из клиентского приложения, я могу видеть все обновления правильно, однако для того, чтобы сохранить все изменения правильно, я должен прыгать через несколько обручей...
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. В частности, в то время как он будет успешно обновлять существующие исключения данных при смешивании в новых объектах.
5 ответов
У меня нет готового ответа для вашего конкретного сценария , но просто вопрос: Вы проверили ADO.NET службы данных (f .к. a. "Астория")?
они построены поверх Entity Framework, интерфейса RESTful WCF, и они предлагают клиентский опыт, а также, похоже, имеют достойную историю не только для запросов, но и для обновления, вставки записей в базы данных.
может ли это быть вариантом?
проверьте их на MSDN, at блог Дэвида Хейдена, on игры Channel9, или посмотреть некоторые из отличных сессий в MIX08 и MIX 09
Марк
вы, вероятно, должны взглянуть на образец EntityBag Дэнни Симмонса.
Он предназначен для упрощения таких проблем: http://code.msdn.microsoft.com/entitybag/
Как говорит CatZ, в .NET 4.0 все будет намного проще.
одна из вещей, которые мы планируем сделать, чтобы помочь, это создание шаблона T4 для вас, который генерирует классы для вас, которые способны самостоятельно отслеживать, и некоторую дополнительную поверхность, чтобы сделать ее простой для этих self-tracking entities to ApplyChanges () в контекст, когда они возвращаются на серверный уровень.
надеюсь, что это помогает
Ура Алекс (PM в команде Entity Framework в Microsoft).
Я вижу, что этот поток тихий, поэтому я позволяю себе сделать небольшое обновление...
Weeeeee ! Самостоятельное отслеживание объектов прибыло в 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-уровневых шаблонов для отключенных объектов.
наслаждайтесь !
в 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 v1.0-это обновление сущностей. К сожалению, я думаю, что вам не повезло, пока не появится версия 2.