Подтвердить что ты не робот

Структура сущностей vs NHibernate - Производительность

Я ищу для внедрения ORM в нашу систему. В настоящее время у нас много таблиц с множеством ужасных данных и хранимых процедур. Я слышал, что использование ORM может замедлить работу системы. Кто-нибудь знает, какая ORM лучше по скорости и производительности, используя Запросы, созданные в коде С# и сопоставление с хранимыми процедурами?

Спасибо

EDIT:

Проект будет использовать существующие большие таблицы и содержать много данных, он также будет использовать существующие хранимые процедуры, которые выполняют сложные задачи в базе данных SQL Server. ORM должен иметь возможность выполнять транзакции и иметь высокую производительность при запуске существующих хранимых процедур и запросов к текущим таблицам. Проект основан на сети и будет использовать веб-службы WCF с DDD. Я вижу, что EF намного проще в использовании и имеет большую поддержку, но если NH является наиболее подходящим вариантом?

4b9b3361

Ответ 1

Entity Framework постоянно внедряет новые функции, и в вашем проекте все автоматизировано. Очень просто использовать Entity Framework, расширять и реорганизовывать ваш код. Visual Studio интегрирует его (Code-First, Database-first, Entity-First...) как шарм. Windows Azure упрощает развертывание и изменение. Кроме того, Visual Studio может генерировать все ваши страницы CRUD за 3 клика.

Я бы предложил вам использовать EF, но это зависит от вашего проекта. Можете ли вы дать нам более подробную информацию об этом?

Вы можете найти множество сравнительных карт в Google, например этот объясняет производительность и этот различия.

EDIT:

Можете ли вы количественно определить количество пользователей в вашем приложении?

Когда вы используете Database-First в EntityFramework, очень легко импортировать и использовать хранимые процедуры, для NHibernate it довольно простой. Обратите внимание: если вы используете множество хранимых процедур и не много одновременных пользователей, выбор CRM между этими двумя может быть не столь важным.

Также не забывайте, что производительность инструмента часто основана на способе его использования. Если вы злоупотребляете ORM (например, async, ленивая/нетерпевая загрузка, базовые классы...), производительность резко снизится.

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

Ответ 2

Оба являются отличными решениями, хотя я лично считаю, что NHibernate лучше для унаследованной базы данных. Вот хорошее сравнение -

http://www.dennisdoomen.net/2013/03/entity-framework-56-vs-nhibernate-3.html

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

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

Если вы хотите полагаться на поддержку инструментария VS, EF лучше. Однако иногда будет какая-то магия (например, EF может использовать отражение, чтобы даже заполнить частные свойства объекта, NHibernate этого не делает, это сила или слабость в зависимости от того, как вы ее видите). EF также хорошо работает с другими поставляемыми корпорацией Майкрософт (например, службами RIA). Мне также нравятся EF-авто миграции (при первом использовании кода).

Если вы хотите больше энергии в своих руках и хотите иметь возможность точно настроить, как все работает с четким разделением проблем (ORM делает только то, что должен делать ORM), NH кажется лучше. Тем не менее, это немного раздражает, чтобы все виртуальные виртуальные объекты NH могли получить к ним доступ.

Я использовал и то и другое, и иногда может быть немного неудобным, чтобы генерировать sql, который вам нужен; в этих 5-10% случаях опускайте еще один уровень и используйте микро-орм, как Dapper, Massive или Petapoco.

EDIT:

NHibernate тоже может заполнять частные свойства, казалось бы, так что это было просто невежество с моей стороны.

Ответ 3

EF 5 или 6 на .NET 4.5 - это один из надежных способов повысить производительность, не ожидайте улучшения скорости с помощью EF 5 на .NET 4.0, это документировано Microsoft. (У нас есть еще одна проблема с плохо написанными операторами LINQ).

В целом, если производительность имеет высокий приоритет, вы не можете бить ADO.NET с помощью хранимых процедур. Вы просто не можете. Добавлено ORM, добавление и контейнер IOC... сколько тестирования производительности вы хотите сделать?

Сдвиньте несколько виртуальных машин с помощью JMETER и удалите сервер с помощью EF и удалите другого с помощью NHibernate. Вы просто заставляете JMETER делать достаточно вызовов для URL-адресов и проверять количество одновременных пользователей, и вы должны увидеть, где находится ваше узкое место.

Ответ 4

проверить это художественное Некоторые преимущества NH над EF

  • NH имеет стратегии генерации 10+ идентификаторов (IDENTITY, последовательность, HiLo, руководство, инкремент, несколько GUID и т.д.), EF имеет только ручную или SQL Server IDENTITY;
  • NH имеет ленивую поддержку свойств (примечание: не сущности, это для свойств строки, XML и т.д.), EF не работает;
  • У NH есть поддержка кеша второго уровня (и, поверьте, разработчики используют его), а EF не работает;
  • У NH есть поддержка настраиваемых типов, даже сложных, с "виртуальными" свойствами, которая включает в себя запрос для этих виртуальных свойств, EF не делает;
  • NH имеет свойства формулы, которые могут быть любыми SQL, EF не имеет;
  • У NH есть автоматические фильтры для объектов и коллекций, EF не работает;
  • NH поддерживает коллекции примитивных типов (строки, целые числа и т.д.), а также компоненты (сложные типы без идентичности), EF не:
  • NH поддерживает 6 видов коллекций (список, набор, сумка, карта, массив, массив id), EF поддерживает только один;
  • NH включает генератор прокси, который можно использовать для настройки сгенерированных прокси, EF не позволяет этого;
  • NH имеет 3 варианта отображения (.HBM.XML, по коду, по атрибутам) и EF только два (по атрибутам, по коду);
  • NH разрешает выборку запросов и вставки (это потому, что EF действительно поддерживает только ключи IDENTITY), EF не работает;
  • NH имеет несколько оптимистичных стратегий управления (столбец на db, включая Oracle ORA_ROWSCN, временную метку, целочисленную версию, все, грязные столбцы), EF поддерживает только SQL Server TIMESTAMP или все

Ответ 5

Возможно, стоит добавить, что Entity Framework имеет проблемы при подключении отключенных графиков и отсутствует функциональность, такая как слияние в Nhibernate. Вы можете обращаться к нему с другими плагинами, но не из коробки. Вот ссылка на функцию Codeplex, требующую лучшей поддержки работы с отключенными объектами, и есть некоторые дальнейшие обсуждения.