2013-04-03 6 views
0

В моем приложении мне нужно получить большой граф объектов, внести различные изменения в то время как отсоединено (добавлять сущности, вносить изменения, удалять сущности), а затем сохранить график обратно в база данных. Я пробовал STE, но он начинает чрезмерно усложнять некоторые аспекты моего клиентского уровня, поэтому я надеялся сохранить все просто (по крайней мере, на стороне клиента), используя вместо этого POCOs.Entity framework - сохранение графика объектов POCO

Когда речь идет о сохраняющихся изменений, я думал, что я мог бы получить график из базы данных снова, и ходить как этот график и график от клиентского уровня, ищет различия: -

  • удаление происходит, когда объект существует в графе базы данных, но не граф клиента. Предположительно, я могу просто .Remove() их из графика базы данных.
  • Новые объекты - это те, что указаны в графике клиента с идентификатором 0. Предположительно, я могу только .Add() их использовать в графике базы данных.
  • Я не уверен, что лучший способ справиться с обновлениями. Я не хочу реализовывать флаг IsDirty для своих объектов и предпочитаю более автоматическое решение. Итак, а) есть ли способ сравнить объект на графике клиента с его коллегой базы данных, чтобы узнать, изменился ли он, и б) каким образом можно применить или объединить клиентский объект в свою базу данных?

Как только все это сделано, я предположительно просто вызываю SaveChanges() на графике базы данных. Я также должен был бы передать этот график клиенту, чтобы он имел последнюю версию (значения, сгенерированные с помощью базы данных, такие как идентификаторы, временные метки).

Является ли мое решение слишком упрощенным? Если это возможно, как я могу справиться с обновлениями, как описано выше?

+0

Это широкий предмет. Я предлагаю вам найти копию книги Лермана и Миллера _DbContext_ и прочитать главу 4 о том, как работать с отключенными объектами. Их предлагаемый подход заключается в реализации интерфейса 'IObjectWithState', который заставляет объект отслеживать собственное состояние изменения. Я не могу сказать, что это действительно элегантно, но, возможно, более общий, чем прохождение определенного графического объекта. –

ответ

0

Ваше решение может работать, но реализовать его не просто - особенно если вы попытаетесь сделать это как-то общее (проверьте ответы в this question - кто-то предложил базу кода, которая должна иметь это уже реализовано). Это также вызывает много дополнительного трафика для базы данных, поэтому это определенно не очень хороший подход, когда вы ожидаете некоторой большой нагрузки. Самое простое решение - это то, что сказал @ Герт Арнольд.

+0

У меня была попытка подхода Лермана, и, хотя она работает, в BLL много работы, поскольку я использую очень большую иерархию. Это также делает клиента более сложным, так как взаимосвязь фиксации более активно связана между собой. Это всего лишь двухуровневое приложение WCF, поэтому я пересматриваю свой подход. Если вы можете сэкономить несколько минут, чтобы ответить, пожалуйста, взгляните на: http://stackoverflow.com/questions/15790286/poco-entities-in-a-2-tier-wcf-application –