2009-04-29 3 views
10

Я создал решение n-уровня, в котором я получаю связанные данные из службы WCF, обновляя его в приложении Windows Forms, а затем возвращаю обновленные данные через WCF для сохранения в базе данных , Приложение, служба WCF и база данных находятся на разных машинах.Entity Framework, WCF и обновления

Данные, извлекаются состоит из объекта и дочерние объекты ...

public Product Select(string catalogueNumber) { 

    return (from p in this.ProductEntities.Products.Include(@"Tracks") 
      where p.vcCatalogueNumber == catalogueNumber 
      select p).FirstOrDefault() ?? new 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. В частности, в то время как он будет успешно обновлять существующие данные, исключения выбрасываются при смешивании в новых объектах.

ответ

3

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

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

Это может быть вариант?

Проверьте их на MSDN, в David Hayden's blog, на Channel9, или увидеть некоторые из прекрасных сессий на MIX08 and MIX 09

Marc

+0

Это, наверное, то, что я должен смотреть на, но у меня пока нет , К сожалению, мы только недавно начали использовать EF & WCF, где я работаю, и Astoria в настоящее время является еще одним пунктом в списке новых технологий для исследования. Благодарю. –

+0

Я, наконец, обдумал это (в первую очередь потому, что начал играть с SilverLight), и на самом деле, я думаю, это тот ответ, который я искал. –

0

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

3

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

Он предназначен для упрощения такого рода вопросы: http://code.msdn.microsoft.com/entitybag/

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

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

Надеется, что это помогает

Приветствия Alex (PM в команде Entity Framework в Microsoft).

+0

Да, и вы получите +2 голоса за то, что рассказали парню, что я только что сказал! :) – mhenrixon

+0

У меня есть alredy, судимый EntityBag и обнаружил, что он не будет делать то, что я хотел. Результаты Google показывают, что EntityBag не работает с EF/RTM, но так же вероятно, что я мог бы сделать это неправильно - в любом случае, у меня было много исключений при попытке обновить родительский объект, когда он также содержал обновления и дополнения к набор дочерних объектов. Спасибо в любом случае! –

1

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

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
Сравнение нескольких многоуровневых моделей для несвязанных лиц.

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

1

В объекте 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); 
} 

}

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