Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что такое POCO объекты 
V
    Опции темы
MaxWave
Дата 23.6.2011, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Объясните пожалуйста, что это и с чем варят. Вот пишут что Entity Framework наконецто поддерживает POCO, все так долго ждали и свершилось. Пишут кучу статей - как использовать POCO и пр.
 Но нигде не написано, что это вообще такое...

0) почему появились POCO, кто их придумал, когда и зачем?
1) какие задачи решает POCO
2) Чем отличается от обычных сущностей (например в EF)
3) Эти сущности обязательно должны маппиться на БД? К примеру я хочу создать свою entity, не привязанную к бд
4) Какие ограничения накладываются на POCO?
5) Когда следует использовать а когда не слудует?

Plain old CLR object - что это значит?
PM MAIL   Вверх
jonie
Дата 23.6.2011, 09:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



http://en.wikipedia.org/wiki/Plain_Old_CLR_Object

Цитата(MaxWave @  23.6.2011,  08:47 Найти цитируемый пост)

1) какие задачи решает POCO
2) Чем отличается от обычных сущностей (например в EF)

просто достаточно простые классы, без наворотов вроде специальных атрибутов какого-либо фремворка (того же EF) или привязки к нему.

Цитата(MaxWave @  23.6.2011,  08:47 Найти цитируемый пост)

3) Эти сущности обязательно должны маппиться на БД? К примеру я хочу создать свою entity, не привязанную к бд

нет конечно, это просто классы никак не базу не завязанные вообще в общем случае.

Цитата(MaxWave @  23.6.2011,  08:47 Найти цитируемый пост)
4) Какие ограничения накладываются на POCO?

никаких, это просто название логической группы (для общения), как например DTO.


UPD: вот в чем вся соль и что все так хлопают в ладоши, когда говорят о EF.CodeFirst:
ранее в EF генерились сущьности, завязанные (и унаследованные) от EF ядра (в частности от Entity и от ObjectContext).
Многие разработчики любят делать такие схемы: service->ef entities->WCF->client, т.е. пробрасывать через сеть EF считая их бизнес объектами*. Но из-за наследования получалось так, что сериализованные EF сущности ломали принципы SOA (принимающая сторона не должна ничего знать об устройстве сервиса), т.к. вместе с данными объекта передавалась и метаинформация от EF-кой части сущности. В дальнейшем это приводит к неприятным последствиям при работе с несколькими языками - например c# и php. В тоже время POCO объекты не обладают наследованием от EF контекста и не несут в себе ненужную (с т.з. передаваемых данных) информацию - то есть не ломают принципы SOA дизайна. Потому все так на эту тему маструбируют радаются....

*) в общем случае такого быть не должно


Это сообщение отредактировал(а) jonie - 23.6.2011, 09:30


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
MaxWave
Дата 23.6.2011, 09:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



6) То есть преимущество POCO перед обычными генерируемыми сущностями только в отсутствии кучи атрибутов? 
7) Что именно наталкивает на использование POCO?  Личная непереносимость генерируемого кода? 
8) Чем плохо жить с обычными entity?
9) Почему POCO так популярны?
10) Какие проблемы может разрешить POCO, с которыми не справляются обычные генерируемые сущности тогоже EF4?
11)Когда должна возникать такая мысль - "Вот тут лучше использовать POCO - это нам поможет.."

5) вопрос открыт smile 

Если вся соль в кастомизации, то partial classes и extension methods вполне покрывают данную потребность.

Это сообщение отредактировал(а) MaxWave - 23.6.2011, 09:45
PM MAIL   Вверх
jonie
Дата 23.6.2011, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(MaxWave @  23.6.2011,  09:36 Найти цитируемый пост)
6) То есть преимущество POCO перед обычными генерируемыми сущностями только в отсутствии кучи атрибутов?

7) Что именно наталкивает на использование POCO?  Личная непереносимость генерируемого кода? 
8) Чем плохо жить с обычными entity?
 

не только. Дефолтный генератор EF4 генерирует сущности наследуемые от EntityObject-та, который содержит в себе ссылку на контект. Кроме того он генерирует "сложные" вещи, например self-traking, который часто нафиг не уперся.
Плохо и наталкивает я уже говорил - чтобы не ломать SOA в приведенном мной примере (например).


Цитата(MaxWave @  23.6.2011,  09:36 Найти цитируемый пост)

9) Почему POCO так популярны?

они простые и понятные, в отличие от тонны кода (генеренего иль нет) для EF пишутся быстро и не приносят сложностей с т.з. кодирования.




--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
MaxWave
Дата 23.6.2011, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Так, ну вроде понятно.
Я использую модель EF4->Wcf ria services->Silverlight

Если мы решили использовать POCO то таковыми должны быть все наши объекты? 
Просто к чему я вообще напоролся на ети все поки - мне нужна кастомная сущность, которая не тянется из БД, а тянется из других источников, но она должна в себе содержать ссылки на обычные EF entity. Тоесть могу ли я заюзать такой POCO:

Код

public class MyObject
{
public List<EFEntity>ChildObjects{get;set;}
}


Вся трабла в том, что если я создаю такой объект (просто собственный класс, не привязанный никак к EF4), то на стороне клиента не генерится св-во ChildObjects - потому что это EF Entity. 

Если же делаем так:
Код

public class MyObject
{
public List<NonEFClass>ChildObjects{get;set;}
}


то все ок и на клиенте мы удачно работаем с коллекцией ChildObjects. Но мне нужен именно EFEntity.Как я не пытался, какбы метадату не правил атрибутами, на клиенте нету MyObject.ChildObjects, потомучто WCF RIA Services его не генерит. Предполагаю, что он этого неделает, т.к. MyObject не принадлежит модели EF. Т.е. какбы EF незнает ничего об MyObject.

POCO меня спасет?


Это сообщение отредактировал(а) MaxWave - 23.6.2011, 10:14
PM MAIL   Вверх
jonie
Дата 23.6.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Плохая идея пробрасывать через сеть EF вообще. Вот тут я развивал идею: http://forum.vingrad.ru/forum/topic-310628...a-services.html


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
MaxWave
Дата 23.6.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 8.3.2006

Репутация: нет
Всего: нет



Решил сделать все на POCO. Теперь все на клиенте видно, что не может не радовать. Но многое теперь придется писать руками  smile . И вы тут же скажете - "А как вы хотели, молодой человек?....". 
Я не говорю о самих POCO, а об объектах, которые их трекят и трансферят - DomainService и ObjectContext.
В теме ты пишешь, что делаешь сервис вот так:
 
Код

[EnableClientAccess]
    public class TaskJournalService : DomainService
    {
        private readonly ITaskJournalRepository _repository;
        public TaskJournalService(ITaskJournalRepository repository)
        {
            _repository = repository;
        }

        public IQueryable<TaskJournal> GetCurrentUserTask()
        {
            var rv = _repository.GetCurrentUserTask().Where(c=>c.Id<14); //пример запроса на вьюху через IRepository
            return rv;
        }
    }


Где и в какой момент создается объект самого TaskJournalService? Просто когда делаешь DomainSevice наследованный от LinqToEntitiesDomainService<EFContext> то не паришься. Здесь же нужно все время создавать и убивать собственный контекст, работаущий с POCO? Как это лучше всего реализовать?
PM MAIL   Вверх
jonie
Дата 23.6.2011, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(MaxWave @  23.6.2011,  14:01 Найти цитируемый пост)
Где и в какой момент создается объект самого TaskJournalService?

в DomainServiceFactory и создается, используя Unity как инжектор


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0729 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.