Вопрос

Я создал 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top