Entity Framework, WCF и обновления - PullRequest
10 голосов
/ 29 апреля 2009

Я создал 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. В частности, при успешном обновлении существующих исключений данных генерируются при добавлении новых объектов.

Ответы [ 5 ]

3 голосов
/ 02 мая 2009

У меня нет готового ответа для вашего конкретного сценария - но только вопрос: вы проверили ADO.NET Data Services (f.k.a. "Astoria")?

Они построены на основе Entity Framework, интерфейса RESTful WCF, и они предлагают работу на стороне клиента, плюс у них также есть неплохая история не только для запросов, но и для обновления, вставки записей в базы данных.

Может ли это быть вариантом?

Проверьте их на MSDN , на блоге Дэвида Хейдена , на Channel9 , или посмотрите некоторые отличные сессии на MIX08 и MIX 09

Марк

3 голосов
/ 03 мая 2009

Возможно, вам стоит взглянуть на образец EntityBag Дэнни Симмонса.

Он предназначен для упрощения таких проблем: http://code.msdn.microsoft.com/entitybag/

Как говорит CatZ, в .NET 4.0 все будет намного проще.

Одна из вещей, которые мы планируем сделать, чтобы помочь, - это создание шаблона T4 для вас, который генерирует классы для вас, которые способны к самопроверке, и некоторую дополнительную поверхность, чтобы сделать эти самосопровождаемые объекты простыми для ApplyChanges () к контексту, когда они возвращаются на серверный уровень.

Надеюсь, это поможет

Приветствие Алекс (руководитель группы Entity Framework в Microsoft).

1 голос
/ 09 марта 2011

В 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);
}

}

Надеюсь, это будет полезно

1 голос
/ 27 октября 2009

Я вижу, что за этой веткой тихо следят, поэтому я позволю себе сделать небольшое обновление ...

Чеееееее! Самоконтроль сущностей прибыл в 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-уровня для отключенных объектов.

Наслаждайтесь!

0 голосов
/ 30 апреля 2009

Одним из ограничений Entity Framework v1.0 является обновление сущностей. К сожалению, я думаю, что вам не повезло, пока не появится версия 2.

...