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 является обновление сущностей. К сожалению, я думаю, что вам не повезло, пока не придет вторая версия.