n-ярусы и ORM и как реализовать ORM - PullRequest
1 голос
/ 09 июня 2011

Обычно я занимаюсь разработкой приложений по уровням (DAL, BLL, UI) с использованием VS.NET 2008 с .net framework 3.5. Для доступа к данным я использую Enterprise Library 4.1 и веду журнал с использованием log4net.

Я слышал об ORM, и интересно реализовать ORM в моем программировании, как это сделать? Это как-то влияет на производительность?

Я знаю 2 ORM, NHibernate и Entity Framework. с www.ormbattle.net Производительность NHibernate не очень хорошая, и Entity Framework, я думаю, слишком «молод» для использования в VS.NET 2008.

А как насчет LINQ2SQL, это один из инструментов ORM? но производительность слишком низкая, чем при использовании обычного способа.

Ответы [ 3 ]

2 голосов
/ 09 июня 2011

Возможно, стоит рассмотреть некоторые из так называемых решений «микро ORM», такие как Dapper , PetaPoco или Massive как альтернативы NHibernate, Subsonic, Linq2Sql, EF и т. Д.

Этот ответ содержит некоторую полезную информацию об опыте использования Subsonic и PetaPoco.

2 голосов
/ 09 июня 2011

Linq2Sql больше не разрабатывается. Они, вероятно, никогда не избавятся от этого, но они больше к этому не прибавляют; устарела в пользу MSEF.

NHibernate, вероятно, так же эффективен, как и любой ORM. Имейте в виду, что большинство ORM используют много рефлексии для создания объектов, получения и установки свойств, переваривания выражений Linq и т. Д. Вы не отойдете от этого без возврата к ADO.NET.

Тем не менее, NHibernate имеет значительную проблему "N + 1" с прокси-сервером PersistentBag. Когда сущность, которая содержит коллекцию дочерних сущностей, создается экземпляром NH из данных, ее дочерняя коллекция устанавливается на прокси-объект, который фактически не содержит данные; он просто знает, как сделать больше звонков, чтобы получить эти данные. Когда вы запрашиваете каждый элемент дочерней коллекции, NHibernate делает еще один вызов БД. Это приводит к общему количеству циклических обращений "N + 1" в БД, где, если вы сами спроектировали свой DAL, вы, вероятно, обрабатываете тот же случай в 2 циклических обходах; один для основного объекта и один для дочерней коллекции.

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

0 голосов
/ 10 июня 2011

Вы можете начать с http://bltoolkit.net. Хорошая и быстрая библиотека доступа к данным с некоторыми приятными функциями ORM. Отлично подходит для миграции устаревшего кода с чистого ADO.NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...