Все здесь прыгают на повозке с ORM?

Microsoft Linq to SQL, Entity Framework (EF), nHibernate и т. Д. Все предлагают ORMS в качестве технологий сопоставления данных следующего поколения и утверждают, что они легкие, быстрые и легкие. Как, например, эта статья, только что опубликованная в журнале VS:

http://visualstudiomagazine.com/features/article.aspx?editorialsid=2583

Кому все нравится внедрять эти технологии в свои проекты? Где инновации в этих технологиях, которые делают их такими большими по сравнению со своими предшественниками?


person Ahmad    schedule 12.12.2008    source источник
comment
Astoria - это не ORM, а механизм доступа к данным с использованием REST / HTTP.   -  person DamienG    schedule 14.12.2008
comment
Вы правы, я уберу это.   -  person Ahmad    schedule 17.12.2008
comment
Я этим не пользуюсь, я сделал свой: valueinjecter.codeplex.com/   -  person Omu    schedule 29.07.2010


Ответы (19)


Я написал уровни доступа к данным, компоненты персистентности и даже свои собственные ORM в сотнях приложений на протяжении многих лет (одно из моих «хобби»); Я даже реализовал свой собственный менеджер бизнес-транзакций (обсуждается в другом месте на SO).

Инструменты ORM уже давно используются на других платформах, таких как Java, Python и т. Д. Похоже, что теперь, когда команды, ориентированные на Microsoft, их открыли, появилась новая мода. В целом, я думаю, что это хорошо - необходимый шаг на пути к изучению и пониманию концепций архитектуры и дизайна, которые, кажется, были введены вместе с появлением .NET.

Итог: я всегда предпочел бы иметь собственный доступ к данным, а не бороться с каким-то инструментом, который пытается мне «помочь». Никогда нельзя отказываться от контроля над своей судьбой, а доступ к данным является важной частью судьбы моего приложения. Некоторые простые принципы делают доступ к данным очень управляемым.

Используйте базовые концепции модульности, абстракции и инкапсуляции - так что оберните базовый API доступа к данным вашей платформы (например, ADO.NET) собственным слоем, который поднимет уровень абстракции ближе к вашему проблемному пространству. НЕ кодируйте весь свой доступ к данным НЕПОСРЕДСТВЕННО против этого API (также обсуждается в другом месте на SO).

Строго применяйте принцип DRY (Don't Repeat Yourself) = рефакторинг дневного света в коде доступа к данным. Используйте генерацию кода, когда это уместно, как средство рефакторинга, но старайтесь по возможности устранять необходимость в генерации кода. Как правило, генерация кода показывает, что в вашей среде чего-то не хватает - языковой недостаточности, ограничений встроенных инструментов и т. Д.

Тем временем научитесь хорошо использовать доступный API, особенно в отношении производительности и надежности, а затем включите эти уроки в свой собственный уровень доступа к абстрактным данным. Например, научитесь правильно использовать параметры в своем SQL, а не встраивать буквальные значения в строки SQL.

Наконец, имейте в виду, что любое приложение / система, которые добьются успеха, вырастет и столкнется с проблемами производительности. Устранение проблем с производительностью больше зависит от их разработки, а не просто «подгонки» чего-то в реализации. Эта проектная работа повлияет на базу данных и приложение, которые должны изменяться синхронно. Поэтому старайтесь иметь возможность легко (гибко) вносить такие изменения, а не пытаться никогда не менять само приложение. Отчасти это в конечном итоге означает возможность развертывать изменения без простоев. Это несложно сделать, если не «проектировать» от этого.

person Rob Williams    schedule 12.12.2008
comment
Строгое применение принципа СУХОЙ (Не повторяйся) также подразумевает, что нельзя переписывать одну и ту же сантехнику в каждом приложении. Ваша привязанность к реализации уровня данных будет влиять на каждое решение и в конечном итоге задушить вас скучными техническими деталями. - person Bryan Watts; 13.12.2008
comment
Я согласен с вами на 100%. Написание собственного уровня доступа к данным с использованием чистого ADO.NET с полным контролем над SQL и объектами - это правильный путь. Вот инструмент, который может вас заинтересовать .. forum.orasissoftware.com/ - person Ahmad; 13.12.2008
comment
Это похоже на еще один инструмент ORM, Ахмад. Обычно все сводится к DataReaders и так далее ... ORM избавляет вас от необходимости писать один и тот же код вручную. С другой стороны, мы написали наш собственный инструмент ORM, поэтому я признаю, что мне нравится контролировать утечки в моих абстракциях. - person Brian MacKay; 13.12.2008
comment
Это не еще один инструмент ORM! Это генератор кода, который строит ваш DAL для вас в соответствии с вашими бизнес-требованиями по отношению к вашим собственным бизнес-объектам. Вы можете сохранить свой сгенерированный код, и этот код не зависит от каких-либо проприетарных библиотек. Никакая ORM не может этого сделать. - person Ahmad; 15.12.2008
comment
@Ahmad: Из вашего URL: Orasis Mapping Studio - это объект для инструмента реляционного сопоставления и генератора кода ... так что они говорят, что это инструмент ORM. У него даже есть собственная IDE?!? Ой. - person Rob Williams; 15.12.2008
comment
@Ahmad: Как вы думаете, что такое ORM-инструмент? - person NotMe; 15.12.2008
comment
Все ORM - это фреймворки, которые вы вызываете во время выполнения, а в некоторых есть дизайнеры графического интерфейса для упрощения настройки. Orasis - это IDE и генератор кода, который позволяет создавать слой сопоставления между пользовательскими объектами .Net и существующей реляционной базой данных с помощью запросов SQL и генерирует чистый код ADO.net. - person Ahmad; 16.12.2008
comment
В чем разница между Orasis и шаблоном CodeSmith, например, .NetTiers? (cyruscrypt.blogspot.com/2005/07/nettier -beta-1-is-Release.html). - person Mauricio Scheffer; 19.12.2008
comment
Если вы скачаете и протестируете Orasis, вы увидите разницу. Orasis не создает код на основе шаблонов. Он создает код в соответствии с вашими бизнес-объектами, запросами и сопоставлениями, которые вы разрабатываете в среде IDE. Он намного сложнее и даже имеет встроенный тестер модулей. - person Ahmad; 20.12.2008

Я большой сторонник ORM. Генерация кода с помощью ORM экономит мне около 20-30% в большинстве наших проектов.

И мы занимаемся разработкой по контракту, так что это большая победа.

Крис Лайвли сделал интересное замечание о необходимости повторного развертывания при каждом касании запроса. Для некоторых это может быть проблемой, но нас это совершенно не трогает. У нас есть правила, запрещающие напрямую вносить изменения в производственную базу данных.

Кроме того, вы по-прежнему можете полагаться на традиционные sprocs и даже представления, когда это необходимо ... Мы не догматически 100% ORM, это точно.

person Brian MacKay    schedule 12.12.2008
comment
В чем проблема с наличием запросов в коде приложения, а не в хранимых процессах? Лучше иметь их в коде приложения и проверять во время компиляции ... иначе вас ждут сюрпризы во время выполнения. Это большое преимущество ORM, особенно Linq To SQL. - person Ahmad; 14.12.2008
comment
По этому поводу ведутся огромные споры. Или было. Может, мы прошли мимо. По сути, вам действительно не нужен конкатенированный SQL в вашем коде, это считается злом, но на самом деле это то, что делают ORM! Они либо создают конкатенированные параметризованные запросы, либо связываются с sprocs в серверной части. - person Brian MacKay; 14.12.2008
comment
Сейчас я придерживаюсь противоположного мнения, что, возможно, можно просто использовать sprocs для задач, с которыми ORM плохо справляются (все, что может вызвать много циклов приема-передачи, дорогостоящие пакетные транзакции и т. Д.), Но многие администраторы баз данных с этим не согласны. Некоторым людям действительно нужна безопасность на уровне sproc и т. Д. Я признаю это. - person Brian MacKay; 14.12.2008
comment
Если вы много занимаетесь разработкой контрактов и хотите сэкономить, а также контролировать качество кода и измерять прогресс DAL, вы можете прочитать эту статью. forum.orasissoftware.com/ - person Ahmad; 15.12.2008
comment
измерить прогресс DAL. Что ты хочешь этим сказать? - person Mauricio Scheffer; 19.12.2008
comment
Думаю, он хотел сказать: «измерение рентабельности инвестиций». Это то, о чем он написал. - person Brian MacKay; 19.12.2008
comment
Тот факт, что вы используете ORM и настроили все для работы в вашем приложении, не означает, что вы закончили разработку DAL. Вы продолжаете строить прогнозы и запросы по мере роста требований. Невозможно измерить, что сделано и что осталось в вашем DAL, а также стоимость всего этого. - person Ahmad; 19.12.2008
comment
Я использую ORM с генерацией кода, поэтому, когда моя база данных изменяется, мои объекты тоже меняются. Большинство моих запросов также записываются (очень быстро) в коде с использованием нашего ORM-пакета. Действительно, есть способ измерить экономию, потому что, как подрядчики, мы оцениваем все, что мы делаем, и я могу смотреть на это с обеих сторон. :) - person Brian MacKay; 10.01.2009

Я был в поезде ORM дольше всех, начиная с бесплатной версии LLBLGen и заканчивая последним и лучшим коммерческим продуктом LLBLGen Pro. Я думаю, что ORM очень хорошо подходят для многих обычных систем ввода и вывода данных.

Однако нельзя сказать, что они решают все проблемы. Это инструмент, который можно использовать там, где есть смысл. Если схема вашей базы данных относительно близка к тому, каким должны быть ваши бизнес-объекты, лучше всего подходят ORM.

person Bob    schedule 12.12.2008
comment
Из любопытства - как провести модульное тестирование кода LLBLGen? Мы используем его в течение многих лет, но на самом деле не достигли необходимого уровня модульного тестирования. Спасибо! - person Beep beep; 14.06.2009
comment
+1. Если схема вашей базы данных относительно близка к тому, каким должны быть ваши бизнес-объекты, лучше всего подходят ORM. - person ; 21.12.2010

Это не повод для беспокойства, это реакция на настоящую проблему! Объектно-реляционное отображение (ORM) существует уже давно и решает настоящую проблему.

Оригинальные объектно-ориентированные (OO) языки были предназначены для моделирования проблем реального мира с помощью компьютерного языка. Можно возразить, что если вы действительно используете объектно-ориентированный язык для создания систем, вы будете моделировать предметную область реального мира с помощью Domain Driven Design (DDD). Это логически приводит вас к модели разделения задач, чтобы ваш DDD был чистым и свободным от всего беспорядка, связанного с сохранением данных и элементами управления приложениями.

Когда вы строите системы по шаблону DDD и используете реляционную базу данных для сохранения, вам действительно нужна хорошая ORM, иначе вы будете тратить слишком много времени на создание и обслуживание базы данных (каламбур).

ORM - это старая проблема, которая была решена много лет назад такими продуктами, как Object Lens и Top Link. Object Lens - это ORM Smalltalk, созданный ParkPlace в 90-х годах. Top Link был создан Object People для Smalltalk, затем преобразован для Java и в настоящее время используется Oracle. Top Link также существует с 90-х годов. Сторонники DDD теперь начинают четко формулировать аргументы в пользу DDD и становятся все более популярными. Поэтому ORM по необходимости становится мейнстримом, и Microsoft просто реагирует как обычно.

person daduffer    schedule 16.12.2008

Нет. Не все.

Вот большой слоник номер один в комнате с большинством инструментов ORM (особенно LINQ to SQL:

Вам гарантируется, что ЛЮБОЕ изменение, связанное с данными, потребует полного повторного развертывания вашего приложения.

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

person NotMe    schedule 12.12.2008
comment
Это не совсем правильно. Большинство ORM (включая LINQ) позволяют выполнять запросы к хранимым процедурам, а не напрямую к таблицам вашей базы данных. - person Brandon Wood; 12.12.2008
comment
Linq to Sql может использовать процедуры, если вы хотите: weblogs.asp.net/scottgu/archive/2007/08/16/ - person Corbin March; 12.12.2008
comment
Да, вы можете использовать sprocs и даже традиционные представления почти в каждом случае. Хотя вы правы, ORM, вероятно, не серебряная пуля, хотя, на мой взгляд, это, по крайней мере, особенно блестящая бронзовая пуля. :) - person Brian MacKay; 12.12.2008
comment
Сохраненные процедуры не являются переносимым решением. Они не более серебряная пуля, чем ORM. Вы просто загрязняете свою БД кодом вместо кода запросами. - person Draemon; 12.12.2008
comment
Обратите внимание, что во многих случаях развертывание изменений схемы базы данных представляет собой гораздо большее дело, чем развертывание изменения кода приложения. - person D'Arcy Rittich; 12.12.2008
comment
Я собирался ответить еще, но я не хочу создавать религиозные дебаты. Скажем так, мне нравится ORM, но он не подходит для каждой ситуации. - person Brian MacKay; 12.12.2008
comment
Крис, ты прав. ORM и даже Linq to SQL означают тесную связь схемы базы данных с логикой приложения. Мне это не нравится! - person Ahmad; 12.12.2008
comment
Об этом заговорили на моем месте работы. Как насчет использования обновляемых представлений с ORM. Это должно позволить некоторую гибкость изменения в db. - person Daniel Auger; 12.12.2008
comment
Я подкреплю это комментарием о том, что, если вы знаете, как заставить базу данных танцевать (SQL, оптимизация запросов и т. Д.), ORM будет мешать, а иногда и не так хорошо выполнять свою работу. Если вы не можете заставить базу данных работать быстро, ORM, скорее всего, подойдет вам. - person dkretz; 12.12.2008
comment
Крис - Я не согласен. Если ваша ORM привязана только к вашим бизнес-объектам, изменение базы данных должно потребовать только повторного развертывания / обновления самой базы данных и кода, содержащего ваши бизнес-объекты, которые в большинстве случаев должны быть отдельной сборкой / динамической библиотекой. - person Harper Shelby; 12.12.2008
comment
@Harper: и код, содержащий ваши бизнес-объекты, вроде как доказывает мою точку зрения, что обновление SQL требует развертывания кода - person NotMe; 13.12.2008
comment
ле дорфье - я не согласен. Создатели ORM фактически говорят, что необходимо очень хорошо знать SQL и реляционные базы данных, прежде чем внедрять ORM. - person Ahmad; 13.12.2008
comment
@Draemon: загрязнение вашей БД кодом .. Я не думаю, что кто-то назовет сохранение операторов SQL с сервером базы данных, загрязняющим его. - person NotMe; 13.12.2008
comment
Я просто хотел бы сказать, что я думаю, что идея о том, что вы можете волшебным образом изменить базу данных, не затрагивая приложение, в большинстве реальных случаев является бессмыслицей. Приложения настолько сильно управляются данными, что, по моему опыту, даже незначительное изменение в базе данных в большинстве случаев потребует изменения кода. - person Sam Schutte; 13.12.2008
comment
О Linq to Sql с procs: кто-нибудь на самом деле это делает? Кто-нибудь? Это было бы нет. Потому что это просто не так хорошо, и вы теряете практически все преимущества использования Linq. - person NotMe; 13.12.2008
comment
@DotNetDaddy: Давайте посмотрим, у вас есть простой запрос выбора, который вызывает тупик в большой часто используемой таблице. Как это исправить? С помощью S'procs вы просто исправляете запрос. С помощью ORM вы исправляете запрос и повторно развертываете все приложение. - person NotMe; 13.12.2008
comment
@Chris и @DotnetDaddy: если изменение базы данных оказывает какое-либо влияние на уровень данных вашего приложения, ваш код должен не компилироваться, а не во время выполнения. Есть несколько способов добиться этого. - person Ahmad; 13.12.2008
comment
Вы можете пойти на компромисс, например, с помощью NHibernate, вы можете сохранить внешне хранимые HQL-запросы, которые вы можете легко повторно развернуть, не изменяя какой-либо скомпилированный код. - person Mauricio Scheffer; 14.12.2008
comment
@ Ахмад: Когда у вас есть несколько проектов, которые зависят от одной и той же базы данных, очень важно, чтобы вы получили код sql ВНЕЗАПНО приложений. Представьте, что вам нужно внести небольшие изменения в базу данных. Используя свой метод, вы ДОЛЖНЫ повторно развернуть ВСЕ приложения. С моим вам, возможно, не придется ничего повторно развертывать. - person NotMe; 15.12.2008

ORM хорошо подходит для людей, которые хорошо ладят с программным обеспечением, которое пишет для них программы; но если вы одержимы контролем над тем, что происходит и почему, ORM может оказаться неоптимальным, особенно с оптимизацией базы данных. Любой уровень абстракции имеет свои издержки и преимущества; В ORM есть и то, и другое, но ИМХО, баланс пока не правильный. И ORM в его нынешней форме по иронии судьбы добавляет уровень абстракции, который по-прежнему объединяет классы и схемы базы данных без ограничений.

Мой опыт показывает, что это может помочь вам быстро собрать концептуальную версию, но может ввести требования рефакторинга, с которыми вы, возможно, не знакомы (по крайней мере, пока).

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

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

person dkretz    schedule 12.12.2008
comment
Вот хорошее обсуждение того, как выбрать реализацию доступа к данным: форумы. orasissoftware.com/ - person Ahmad; 13.12.2008
comment
Вот еще один, лучше IMO: ayende.com/Blog/archive/2006 / 05/12 / Соответствует ли Orasis всем этим характеристикам? - person Mauricio Scheffer; 19.12.2008
comment
Orasis - это не ORM, это генератор кода DAL. Генератор кода, который генерирует исполняемый код для заполнения ваших объектов данными из запросов. Так что этот список неприменим. Необязательно, чтобы все эти функции были реализованы всеми DAL, некоторые из них являются функциями бизнес-уровня. - person Ahmad; 20.12.2008

Вам придется бороться с системой ORM, если вы хотите сделать что-либо, кроме простейшего выбора, обновления или удаления. И ваше выступление уходит в унитаз, как только вы начинаете делать настоящие вещи.

So no.

person Ian Boyd    schedule 12.12.2008
comment
Правильный. Разве уровень DAL не должен полностью зависеть от производительности? Я видел сценарии, в которых ORM, например nHibernate, требовал минут, чтобы открыть экран с интенсивным использованием данных. Когда мы просмотрели журнал SQL, он выполнил сотни запросов! - person Ahmad; 12.12.2008
comment
Я видел сценарии, в которых ORM, например nHibernate, требовал минут, чтобы открыть экран с интенсивным использованием данных - я видел ту же ситуацию с вручную свернутым sql. Инструменты не виноваты в их разработчике. - person Owen; 13.12.2008
comment
Да, но в SQL вы можете улучшить производительность, настроив свой SQL и все. В ORM у вас нет контроля над генерируемым SQL, поэтому вы связаны. Единственный вариант, который у вас есть, - это изменить отношения объектов и создать легковесные объекты, которые портят вашу модель предметной области. - person Ahmad; 13.12.2008
comment
@Ahmad: если вы используете NHibernate и выполняете сотни запросов, вы, вероятно, нажимаете select N + 1, в Интернете есть много статей об этом. Любой инструмент можно использовать неправильно. - person Mauricio Scheffer; 14.12.2008

Я с нетерпением жду того дня, когда моя команда начнет изучать решения ORM. До этого дня мы являемся магазином чистых наборов данных / хранимых процедур, и позвольте мне сказать вам, что не все печенье и подливы являются «чистыми».

Во-первых, новый Linq to SQL по производительности близок к хранимым процедурам и устройствам чтения данных. Мы везде используем наборы данных, поэтому производительность улучшится. Пока все хорошо для ORM.

Во-вторых, у сохраненных процедур есть дополнительное преимущество, заключающееся в том, что они выпускаются отдельно от кода, но они также имеют недостаток в том, что они выпускаются отдельно от кода. Представьте на секунду, что у вас есть база данных, к которой подключено более 5 систем и над ней работает более 10 человек. Теперь подумайте об управлении всеми этими изменениями и зависимостями хранимых процедур, особенно при наличии общей базы кода. Это кошмар ...

В-третьих, сложно отлаживать хранимые процессы. Они часто приводят к ошибочному поведению по разным причинам. Это не значит, что то же самое не может быть результатом динамического sql, созданного ORM, но на одну проблему меньше - на одну проблему меньше. Никаких проблем с разрешениями (хотя в основном они решены в SQL 2005), никакой многоступенчатой ​​разработки. Написание запроса, тестирование запроса, развертывание запроса, привязка его к коду, тестирование кода, развертывание кода. Запрос является частью кода, и я считаю, что это хорошо.

В-четвертых, вы по-прежнему можете использовать хранимые процедуры. Создание отчетов, которые занимают много времени? Сохраненные процедуры - лучшее решение. Почему? Планы выполнения запросов могут быть оптимизированы ядром базы данных. Я не буду притворяться, что понимаю всю работу базы данных, но я знаю, что в настоящее время существуют некоторые ограничения для оптимизации динамического sql, и это компромисс, который мы делаем при использовании ORM. Однако при использовании решения ORM не исключены сохраненные процессы.

На самом деле самая большая причина, по которой я вижу, что люди избегают ORM, заключается в том, что у них просто нет опыта работы с ним. Будет очевидная кривая обучения и стадия незнания. Однако, если это улучшит производительность разработки и вряд ли помешает (или, в моем случае, улучшит) производительность. Это компромисс, на который стоит пойти.

person Ty.    schedule 16.12.2008
comment
Вот мои два цента после работы над крупномасштабным проектом ORM. theahmadblog.blogspot.com - person Ahmad; 16.12.2008
comment
Какой ORM вы использовали Ахмад? - person Ty.; 19.12.2008

Я тоже большой поклонник EF и Linq-to-SQL. Мои причины:

Поскольку LINQ скомпилирован и безопасен по типу, вы не получите проблем с опечатками в "строковом" SQL. Я не знаю, сколько часов я провел в своей жизни, отслеживая ошибку в SP или другом SQL, где «галочка» или какое-то другое ключевое слово было не в том месте.

Вышеперечисленные и другие факторы ускоряют разработку.

Хотя, безусловно, существуют накладные расходы по сравнению с методами запросов к базе данных «ближе к металлу», но никто из нас вообще не стал бы использовать .NET или даже C ++, если бы производительность была нашей проблемой №1. Для большинства приложений мне удалось получить отличную производительность от Linq-To-SQL, даже без использования подхода хранимой процедуры (мой обычный подход - это скомпилированные запросы на основе клиента).

Конечно, для некоторых приложений вы все же хотите делать что-то по старинке.

person Sam Schutte    schedule 12.12.2008
comment
какая польза от безопасности типов, если вы не можете перемещать данные (т.е. анонимные типы, которые обеспечивают строгую типизацию, не могут быть перемещены из локальной функции) - person alchemical; 02.07.2009
comment
Не анонимные типы обеспечивают строгую типизацию - строгая типизация исходит из классов, созданных для сущностей базы данных. Они могут быть возвращены и ссылаться на них вне фактического вызова базы данных, хотя я обычно считаю лучшей практикой использовать вместо этого POCO в этот момент, просто для лучшего разделения. - person Sam Schutte; 07.07.2009
comment
+1 Однако хороший инструмент БД сможет проанализировать SP (новые или существующие) и сообщить вам, содержат ли они какие-либо синтаксические ошибки или потенциальные несоответствия. Я уверен, что есть аналогичные инструменты для других подходов к оболочке SQL. LINQ / EF просто заставляет это делать из-за того, как они работают (но ряд динамических ORM - например, Rails - не предлагают эту статическую проверку, даже если они сгенерировали допустимый синтаксис SQL). - person ; 22.12.2010

Я предполагаю, что я имел в виду, какие инновации предоставляют ORM для построения вашего DAL с использованием традиционных ADO.NET, SQL и сопоставления их с объектами в коде?

Вот три основных части моего DAL, и я сравниваю с ORM, чтобы увидеть преимущества:

  1. У вас все еще должен быть запрос в ORM = SQL (SQL намного мощнее)

  2. Код сопоставления переходит в конфигурацию, но все еще не устраняется, просто переходит от одной парадигмы к другой.

  3. Объекты должны определяться и управляться в тесной связи с вашей схемой данных, в отличие от традиционного подхода, при котором я могу держать их разделенными.

Я что-то упускаю?

person Ahmad    schedule 12.12.2008
comment
Ахмад - вот что такое ORM. Они просто предназначены для того, чтобы быть очень гибкими объектами для получения данных в базе данных и из нее ... Более гибкие, чем CRUD. А с генерацией кода вам не нужно делать это вручную. Вы можете построить 200 объектов мгновенно. Взгляните, например, на CodeSmith. - person Brian MacKay; 12.12.2008
comment
И есть коллекции и т. Д., Поэтому вы можете выполнять привязку данных. Это просто более простой способ работы с данными, и он работает во многих сценариях. - person Brian MacKay; 12.12.2008
comment
Да, и запросить тоже проще. Вам не нужно писать весь sproc каждый раз, когда вам нужны новые данные. Это огромная экономия времени. - person Brian MacKay; 12.12.2008
comment
@Ahmad: например, с HQL NHIbernate большинство запросов на самом деле меньше, чем их эквивалентный SQL. См. hibernate.org/hib_docs/nhibernate/1.2/reference / en / html / - person Mauricio Scheffer; 14.12.2008
comment
HQL может быть меньше, но SQL, который генерируется под ним, может быть намного больше и медленнее, чем если бы вы написали SQL. Так что вы покупаете кроме удобочитаемости. В конце концов, запрос должен дать правильные результаты и быстро. Оба эти запроса HQL не могут быть обработаны. - person Ahmad; 14.12.2008
comment
Использую NHibernate с v0.8.3 (3 года). Он генерирует правильный и производительный SQL в 99% случаев. Я просто заменяю остальные 1% на SQL ручной работы, и все. - person Mauricio Scheffer; 15.12.2008
comment
Некоторые вещи, которые делает возможным ORM: ayende.com/ Блог / архив / 2008/01/27 / ORM - 2.aspx Вам потребовалось бы много усилий, чтобы делать такие вещи без ORM ... - person Mauricio Scheffer; 15.12.2008
comment
@mausch: Невозможно оценить это утверждение - в URL-адресе нет содержимого, кроме списка желаний. - person Rob Williams; 15.12.2008
comment
@Rob Williams - нет, по URL-адресу у ayende есть список тем, о которых он говорил. Это не фантастика. - person sirrocco; 16.12.2008
comment
да, вы можете построить 200 объектов мгновенно - теперь вы можете управлять еще 200 объектами, которые также не обязательно делают что-либо, что вам нужно! - person alchemical; 02.07.2009
comment
Абсолютно NagaMensch. В нашей системе были сотни сгенерированных объектов, но ни один из них не сделал того, что нужно! Вместо того, чтобы выяснять, какие из них использовать и собрать, было проще просто создать один для наших нужд и двигаться дальше. Сгенерированные объекты стали проблемой вместо решения !! - person Ahmad; 04.07.2009

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

person Chris Marisic    schedule 12.12.2008

Я большой парень ORM, извлекаю логику из базы данных, использую базу данных только для скорости.

Мне нравится скорость, с которой вы можете разработать приложение. Самым большим преимуществом, в зависимости от ORM, является то, что вы можете изменить серверную часть без необходимости переводить бизнес-логику.

Я перешел на LINQ и никогда не оглядывался назад. DBLinq отлично подходит для работы с другими базами данных, кроме MSSQL. Я использовал его с МОИМ SQL, и это ОТЛИЧНО.

person David Basarab    schedule 12.12.2008
comment
По моему опыту, ORM не ускоряют работу. Они фактически мешают вам использовать запросы настройки / оптимизации для повышения производительности. Они могут улучшить скорость разработки, но по моему опыту они всегда работают медленнее или равны традиционным подходам. - person Ahmad; 12.12.2008
comment
Большинство ORM поддерживают использование хранимых процедур. Для деталей, критичных к работе, используйте правильный инструмент. - person Min; 12.12.2008

еще нет, все еще скептически; как и большинство продуктов Microsoft, я жду SP2 или полтора года, прежде чем доверять им в среде producton

и обратите внимание, что практически каждая новая вещь, представленная кем-либо, не только Microsoft, провозглашается «легкой, быстрой и простой» - воспринимайте это с некоторой долей скепсиса. Они не так громко рекламируют проблемы / проблемы, как преимущества / особенности! Вот почему мы ждем, пока их откроют ранние последователи.

Это не для того, чтобы принижать ORM, LINQ или что-то в этом роде; Я оставляю за собой суждение до

  • Я успеваю их оценить,
  • возникает потребность, которую могут удовлетворить только они,
  • технология кажется стабильной и достаточно хорошо поддерживаемой, чтобы рисковать в производственной среде одного из моих клиентов, и / или
  • клиент запрашивает это

Обратите внимание: я делал ORM раньше, вручную, и он работал нормально, поэтому я возлагаю большие надежды на новые системы ORM.

person Steven A. Lowe    schedule 12.12.2008
comment
Да, на самом деле в моей работе мы берем наш собственный внутренний инструмент ORM (который на самом деле довольно неплохой), а затем используем CodeSmith для создания BusinessObjects. Работает отлично. Я оцениваю альтернативы, такие как Linq2Sql, Subsonic и т. Д. Но это большой вызов. - person Brian MacKay; 12.12.2008
comment
Linq2sql лучше, чем любой традиционный ORM ... на самом деле любой ORM с поддержкой Linq лучше традиционных. - person Pop Catalin; 12.12.2008
comment
Если Codemith генерирует код на основе ваших таблиц, разве вы все еще не сильно привязаны к своей схеме данных? Я бы предпочел решение, которое отделяет мои объекты от схемы базы данных для большей гибкости в архитектуре. - person Ahmad; 12.12.2008
comment
Ахмад: в Codemith вы можете писать шаблоны, которые будут генерировать все, что вы хотите, на основе всего, что вы хотите - это .Net. В нашем инструменте ORM он в конечном итоге работает с XML-документом, который изначально основан на базе данных. Вы можете делать там все, что угодно. Инструменты нового поколения делают даже больше. - person Brian MacKay; 12.12.2008
comment
@steven: ORM не новы в .net. Пользуюсь NHibernate три года, сейчас это очень стабильный продукт. - person Mauricio Scheffer; 19.12.2008
comment
@mausch: новое относительно. ORM существуют уже более 20 лет; шумиха в мире .NET относительно нова - person Steven A. Lowe; 19.12.2008

Если Codemith генерирует код на основе ваших таблиц, разве вы все еще не сильно привязаны к своей схеме данных? Я бы предпочел решение, которое отделяет мои объекты от схемы базы данных для большей гибкости в архитектуре.

Это из одного из ваших комментариев - это правда, CodeSmith тесно связывает вас с вашими столами.

NHibernate, с другой стороны, имеет набор функций, которые могут помочь в этом: у вас есть компоненты, поэтому в коде вы можете иметь: лицо со свойством Address, где Address - это отдельный класс.

Вы также можете сопоставление наследования. Таким образом, он отлично справляется с отделением вашей схемы от вашего домена.

person sirrocco    schedule 12.12.2008
comment
Думаю, я не согласен с тем, что CodeSmith жестко связывает вас с таблицами. Вы можете писать шаблоны, чтобы генерировать все, что захотите. :) Мой ORM-инструмент позволяет создавать самые разные вещи. - person Brian MacKay; 12.12.2008

Там, где я работаю, мы до сих пор используем скрученную вручную повторяющуюся пасту Cut'n'paste DAL. Это чрезвычайно болезненно, сложно и подвержено ошибкам, но это то, что могут понять все разработчики. Хотя в настоящее время это работает для нас, я не рекомендую его, поскольку он начинает быстро ломаться на больших проектах. Если кто-то не хочет переходить на полномасштабную ORM, я бы по крайней мере поддержал какое-то поколение DAL.

person Daniel Auger    schedule 12.12.2008
comment
Вы должны использовать генератор DAL, который может генерировать код для сопоставления SQL с объектами. Ибатис - один, а Orasis Mapping Studio - другой. Вы можете их погуглить. - person Ahmad; 12.12.2008

На самом деле я работаю над написанием инструмента ORM в .NET в качестве побочного проекта, чтобы развлечь меня.

SQL мертв для меня. Я ненавижу писать это, особенно когда это где-то в моем коде. Ручное написание запросов на выбор / вставку / обновление / удаление для каждого объекта - это пустая трата времени, ИМО. И даже не заставляйте меня обрабатывать NULL («where col_1 =?» Vs «where col_1 is null») при динамической генерации запросов. Инструменты ORM могут справиться с этим за меня.

Кроме того, наличие одного места, в котором SQL может быть динамически сгенерировано, будет иметь большое значение для устранения атак с использованием SQL-инъекций.

С другой стороны, я использовал Hibernate, и я его абсолютно ненавижу. В реальном проекте каждые несколько недель мы сталкивались с ограничениями, нереализованными частями и ошибками.

Сохранение стороны БД логики запросов (обычно в виде представления или хранимой процедуры) также имеет то преимущество, что администраторы баз данных могут их настраивать. Это была постоянная борьба на моей последней работе с использованием Hibernate. Администраторы баз данных: «дайте нам все возможные запросы, чтобы мы могли настроить». Разработчики: «Я не знаю, потому что Hibernate будет генерировать их на лету. Я могу дать вам HQL и отображение XML!» DBA: «Не заставляй меня бить тебя по лицу!»

person CodingWithSpike    schedule 12.12.2008
comment
Итак, если вам неудобно обрабатывать NULL и вручную писать простой SQL, то это либо ORM, либо найти кого-то, кто этого не делает? - person dkretz; 12.12.2008
comment
дайте нам ВСЕ возможные запросы, чтобы мы могли настроить: это не способ оптимизации. Сначала найдите страницы / варианты использования, которые плохо работают, и проанализируйте их. Если он не может быть оптимизирован на уровне кода / ORM (т.е. выберите N + 1), замените его вручную настроенным SQL DBA, проверьте отсутствие индексов и т. Д. - person Mauricio Scheffer; 14.12.2008

Мне не нравится генерация кода, используемая в большинстве ORM. Фактически, генерация кода в целом я считаю слабым инструментом, который обычно свидетельствует об использовании неправильного языка в первую очередь.

В частности, с отражением .Net я не вижу необходимости в генерации кода для целей ORM.

person Jeff Kotula    schedule 12.12.2008
comment
Под генерацией кода вы имеете в виду SQL, который генерируется такими вещами, как LINQ to SQL? - person Richard Ev; 13.12.2008

Вот одно твердое мнение.

person Tim Scott    schedule 14.12.2008
comment
Еще один об этом, который мне нравится от Айенде: ayende.com/Blog/ архив / 2006/05/12 / - person Mauricio Scheffer; 14.12.2008

Нет, я сбросил ORM и переключился на smalltalk и OODB: Gemstone. Лучший код, меньше кода, более быстрая разработка.

person Stephan Eggermont    schedule 21.12.2010