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.