Каковы существенные различия между различными элементами генерации кода для модели EDMX?

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

Кажется, что POCO изолирует структуры данных сущности от ojbect, которые перемещают их в/из хранилища данных.

Я не уверен, что такое "Self-Tracking Entity". Я предполагаю, что часть отслеживания подразумевает реализацию так называемого шаблона "единицы работы", но я не являюсь позитивным. И еще больше головокружительно, я думаю, мне интересно, "само отслеживание, в отличие от чего?".

enter image description here

Ответ 1

Генератор POCO

POCO означает объект Plain Old С# (или CLR). POCO независимы от EF. Это просто классы, следуя некоторым правилам, но вы можете наследовать их из своего собственного типа, если хотите. Они также не содержат данных, зависящих от сохранения.

В настоящее время этот тип наиболее популярен, потому что это тенденция существующих подходов к архитектуре, чтобы иметь все POCO и легкий. В некоторых ситуациях использование POCOs является более сложным, но это цена за сохранность неосведомленной архитектуры.

Генератор EntityObject

Этот генератор создает объекты того же типа, что и метод генерации кода по умолчанию для EDMX. Эти объекты происходят из класса EntityObject, что делает их полностью зависимыми от структуры Entity (я называю их тяжелыми объектами). Эта зависимость предлагает им некоторые дополнительные функции или упрощения, но это усложняет их использование в отдельных сценариях, и их использование приводит либо к архитектуре с плотной связью верхних слоев с каркасом Entity, либо к дополнительным сложностям при достижении лучшего разделения.

Этот тип объектов был единственным типом, поддерживаемым в первой версии EF. Даже все используют POCOs для достижения лучшего разделения. Этот тип является родным для EF и, вероятно, предлагает большинство функций.

Этот генератор также делает ваши сущности сериализуемыми (с DataContractSerializer).

Генератор самоконтроля (STE)

Это очень специальный тип генератора POCO. При работе с EF мы различаем два сценария. Приложенный сценарий, в котором EF отслеживает изменения, внесенные в сущность и снятый сценарий, когда вы делали изменения за пределами области EF, и как только вы привязали объект к EF, вы должны сообщить ему, какие изменения вы сделали. Типичными отдельными сценариями являются веб-службы, в которых вы передаете объекты клиенту, и как только клиент передает их обратно, вы должны каким-то образом синхронизировать изменения, чтобы EF знал, какие команды SQL он должен генерировать. STE для этих снятых сценариев. Это реализация шаблона набора изменений = они отслеживают их текущее состояние, а также изменения, сделанные после начала самостоятельного отслеживания (как это делал старый DataSet).

Это теория. В реальном мире STE имеют некоторые большие недостатки и подходят только для очень специфических сценариев.

Edit:

Существует еще один генератор, который устанавливается вместе с Entity Framework 4.1.

Генератор DbContext

Этот генератор приводит к тем же объектам, что и генератор POCO. Единственное различие заключается в использовании API. Генератор POCO использует ObjectContext API, тогда как генератор DbContext использует POCOs с API DbContext (доступен только в EF 4.1 и CTC 2011). Разница между этими API-интерфейсами - вопрос выбора.