Здравствуйте, Tom, Вы писали:
Tom>Всем привет,
Tom>Хотелось бы в одном месте, например в одном топике собрать все проблемы которые вытекают из обьектно ориентированного способа работы с данными (БД) и использовании ORM средств.
Tom>Очень желательны примеры кода!
Tom>Хорошие статьи на эту тему тоже приветствуются.
Tom>Для разминки сразу вставлю свои 5 копеек — Практически все ORM заставляют пользователя использовать LazyLoad, без него они практически не работоспособны.
Tom>Ну и статья так же для разминки
Tom>http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx
ORM — Object Relational
Mapping (-er). Как ни странно, название отражает, как мне кажется, квинтэссенцию ОРМ — это маппинг данных в объекты. То есть грубо говоря, данные из базы (и обратно в базу кстати тоже) у нас поступают в виде, требующем использовать строки (или индексы) для доступа.
var reader = CreateDataReader();
reader.Read();
var value = reader.GetValue(reader.GetOrdinal("Id"));
В то же время ОРМ — это инструмент, который как минимум транслирует эти данные в объекты, позволяющие доступ по именам членов класса. (На полную абстрактность и корректность для всех существующих языков не претендую).
То есть, если вы напишите нечто вроде
// Код 1
var reader = CreateDataReader();
reader.Read();
yield return new Product
{
Id = reader.GetInt32(reader.GetOrdinal("Id")),
Name = reader.GetString(reader.GetOrdinal("ProductName")
};
то поздравляю, вы на пути к ОРМ, и написали, строго говоря, маленький "маппер вручную".
Все остальные умные слова, такие как Identity Mapping, Change Tracking, Typed Query Expressions и так далее — это все навороты над простой в сущности идеей: избавить вас от написания кода для перевода данных ридера в данные объекта. И по возможности обратно тоже.
Прежде чем рассматривать все вышеперечисленные навороты, давайте поглядим на Код 1, и увидим самый фундаментальный недостаток ОРМ, который, в лучших традициях диалектики является также и прямым его достоинством: а именно: "используя ОРМ, мы лишаемся свободы и гибкости манипулирования данными, и получаем взамен грубость строготипизированных объектов". Вообще, я считаю, что этот недостаток является фундаментальным только в том случае, если нашим запросам к источнику данных свойственна "горизонтальная изменчивость" — то есть если они могут возвращать резалтсеты с разным количеством и разными именами колонок.