«POCO» - неопределенный термин в пространстве ORM. Люди по-разному используют это для обозначения:
- «Чистые» POCO, которые не отслеживают изменения, не загружаются, имеют личные свойства и т. Д. С ними может быть сложно работать.
- Psuedo-POCO прокси: типы со всем
public virtual
и имеющие разные типы во время выполнения.
- Самостоятельно отслеживаемые объекты. Не POCO, но и не
EntityObject
.
Я считаю, что определение "не зависит от внешней структуры" несколько корыстно. Это способ игнорировать ограничения фреймворка. Т.е. в моей книге прокси не являются настоящими POCO, но они соответствуют этому определению.
Что не так с EntityObject
? Не много. Он довольно легкий и является частью .NET. Даже в профиле клиента .NET 4. Это даже не цепляет вас к EF. Хотя было бы странно использовать его как «тип POCO» с другой структурой, он работал бы просто отлично. Тем не менее, это не в Silverlight, IIRC.
С объектами POCO сложнее работать, потому что вы теряете материал, который EntityObject
дает вам бесплатно. Это не много, но нужно подумать, прежде чем выбирать POCO, просто потому что «они крутые», особенно для новичков в EF.
Одна вещь, которую многие люди, проявляющие религиозность в отношении POCO, склонны игнорировать: отображение типов, не относящихся к POCO, никоим образом не ограничивает возможность подвергать эти типы, не относящиеся к POCO, извне. Ваши службы данных могут проецировать сопоставленные типы, отличные от POCO, на не сопоставленные DTO POCO, и вы можете выбрать показ только этих типов, т.е.
public IEnumerable<FooDto> IFooRepository.SelectAll()
{
return from f in Context.Foos
select new FooDto { Id = f.Id, Name = f.Name };
}
Таким образом, типы отображения и типы служб данных могут легко вызывать различные проблемы, если вы того пожелаете.
Когда вам абсолютно необходимы типы не EntityObject
для отображения? Что ж, если вам нужны самообследуемые объекты, это открытый и закрытый случай. Если вам необходимо предоставить доступ к отображаемым типам для Silverlight, то это тоже ясно.
Кроме того, это менее ясно. Если вы пишете службу данных для общественного пользования, то не следует делать DTO подтипами EntityObject
, потому что это помешает подключить другую среду позже. Я бы никогда не сделал неизменный общедоступный интерфейс зависимым от какой-либо одной среды, даже той, которая включена в .NET. С другой стороны, как я уже говорил выше, вы можете выставлять один тип и отображать другой; никогда не требуется выставлять сопоставленные типы, и зачастую это очень веские причины не предоставлять их (возможно, они содержат непубличные данные).