SlideShare a Scribd company logo
1 of 43
ORM
         На примерах NHibernate, Entity Framework, LINQ to SQL


Цуканов Павел
ptsukanov@codereign.net
Skype: cpp.tula
ORM это
• Object Relational Mapping = Объектно-
  ориентированная проекция
  (отображение)
• А если проще. Это возможность без
  больших затрат сохранять/считывать
  объекты в базе данных
Что было до ORM
Что стало после
А зачем это надо
• Меньше кода.
• Нет небходимости самому писать SQL
  запросы.
• Нет необходимости самому создавать
  объекты.
• Можно работать с имеющимся
  доменными/бизнес объектами.
• В конечном итоге это проще
  сопровождать.
5 причин использовать ORM
• Сокращает время разработки.
• Позволяет создать более лучший код.
• Нет необходимости быть экспертом .NET,
  что-бы использовать ORM.
• Сокращает время тестирования.
• Упрощает сопровождение.
Сокращает время
         разработки
• Сокращает вам кучу времени на разработку от
  20% до 50% (в зависимости от проектов).
• Типично для 15-20 таблиц это 30-50 объектов,
  а это примерно от 5000 до 10000 строк кода. И
  это надо написать и протестировать.
• С ORM тоже можно сделать за 1-2 дня. Причём
  основное время потребуется на обдумывание
  как осуществить маппирование корректно.
Позволяет создать более
        лучший код.
• Разные люди в команде могут создать свой
  уникальный код для преобразования объектов
  из/в БД, опираясь исключительно на свой опыт.
• ORM использует шаблоны кода, которые имеют
  отличный дизайн. Причем, эти шаблоны кода
  почти всегда следуют известным шаблонам
  проектирования. Таким образом, код, который
  вы будете получать от ORM очень вероятно,
  будет лучше разработаны, чем код,
  разработанный собственной командой.
Нет необходимости быть
         экспертом .NET, что-бы
         использовать ORM.
• Вы можете начать использовать ORM очень
  быстро имея лишь поверхностные знания.
• Удивительно, но это факт, подчеркнутый
  из собственного опыта.
• При этом ваш код не будет сильно
  отличаться от экспертов в этом вопросе.
• Хотя конечно, есть и подводные камни.
Сокращает время
         тестирования.
• Вам нет необходимости вручную
  преобразовывать объекты из/в базу
  данных. А следовательно нет
  необходимости тестировать того чего нет.
• Код который делает такое преобразование
  написан за вас и уже протестирован.
Упрощает
          сопровождение.
• Жизнь программы не заканчивается
  выпуском релиза. Она живёт и
  развивается и изменение кода в случае с
  ORM менее затратное занятие. Так как вы
  написали меньше кода
• Разработчик знающий как функционирует
  та или иная ORM может без проблем
  переключится с проекта на проект и
  понять как тут всё устроено.
Что у нас есть
• LINQ to SQL (
  http://msdn.microsoft.com/en-en/library/bb386976.aspx
  )
• Entity Framework (
  http://msdn.microsoft.com/en-en/library/bb399572.aspx
  )
• Nhibernate (http://nhforge.org)
• eXpressPersistent Objects™ (
  http://www.devexpress.com/products/NET/XPO)
• LLBLGen Pro (http://www.llblgen.com)
• Dapper.NET (
  http://code.google.com/p/dapper-dot-net/)(ORM
  сайта StackOverflow).
LINQ to SQL


• Входит в состав .Net Framework начиная с
  3.5.
• Разработано спецально для работы с MSSQL
  сервером через LINQ.
• Отказано в развитии.
Entity Framework

• Входит в состав .Net Framework начиная
  с 3.5
• С .Net Framework 4.0 это рекомендуемый
  способ доступа к БД через Linq
• Последняя версия 5.0 находится в бетта
  версии и будет доступна с .Net
  Framework 4.5
• ORM-решение для платформы Microsoft .NET
  портированное с Java.
• Бесплатная библиотека модно найти на
  http://nhforge.org
• Последняя версия 3.2
Сравним
1    Сложность
• LINQ to SQL – Самая лёгкая и простая
• Entity Framework – Более сложная.
  Визуальный интерфейс позволяет сделать
  сложные вещи очень просто.
• NHibernate – Наиболее продвинутая ORM
  из вышеперечисленных
2     Наследование
• LINQ to SQL – Table per Class Hierarchy
  (TPH).
• Entity Framework – несколько видов
  наследования Table per Class Hierarchy
  (TPH), Table per Type (TPT), and Table per
  Concrete Class (TPC).
• NHibernate – дополнительно к NHibernate
  - Implicit polymorphism
TPH (Table per Class Hierarchy )
TPT (Table per Type)
TPC (Table per Concrete Class)
Implicit polymorphism

public static List<Object> GetAll()
{
   List<Object> objects = session.find(“from Object”);
   return objects;
}
3    Поддержка БД
• LINQ to SQL – MSSQL2000 и старше.
• Entity Framework – MSSQL, IBM DB2, Sybase
  SqlAnywhere, Oracle, SQL Azure и многие
  другие. Главное чтобы был ADO.Net Data
  provider для соответствующей БД.
• NHibernate – Microsoft SQL Server
  2005/2000, Oracle, Microsoft Access,
  Firebird, PostgreSQL, DB2 UDB, MySQL,
  SQLite. Определяется наличием
  соответствующего драйвера у NHibernate.
4     Сложность разработки
• LINQ to SQL – прост в обучении и при
  разработке простых приложений.
• Entity Framework – более сложная
  библиотека и требует время на изучение всех
  ньюансов. Рекомендуется как для простых так
  и сложных приложений.
• NHibernate – Достаточно сложная в изучении
  чем Entity Framework. Однако гибкость
  конфигурирования позволяет легко
  сопровождать приложения. Рекомендую для
  сложных проектов.
Типы используемых
 5     файлов
• LINQ to SQL – файл DBML – содержит XML
  маппинг классов к таблицам
• Entity Framework – обычно EDMX файл
  генерируется во время разработки.
  Остальные CSDL, SSDL, MSL файлы во
  время компиляции.
• NHibernate – XML файлы конфигурации.
Поддержка комплексных
  6     типов
• LINQ to SQL – нет
• Entity Framework – да
• NHibernate – нет.
7      Поддержка LINQ
• LINQ to SQL – да. Основной способ работы
  с базой данных.
• Entity Framework – да. Основной способ
  работы с базой данных.
• NHibernate – да, но в ограниченном
  объёме (во всяком случае в NH 2.0).
8     Производительность
• Cчитается что как ни странно Entity
  Framework – быстрее чем LINQ to SQL.
• NHibernate – позволяет добиться более
  высокой производительности при более
  тонкой настройке.
9      Будущее библиотек
• LINQ to SQL – не развивается.
• Entity Framework – активно развивается и
  конечном итоге дожна заменить LINQ to
  SQL.
• NHibernate – развивается пока есть
  энтузиасты.
Генерация кода из БД и
 10     наоборот
• LINQ to SQL – генерирует классы из БД.
• Entity Framework – генерирует классы из
  БД и наоборот
• NHibernate – всё ручками.
Работа с POCO (Plain Old CLR
 11     Objects) объектами
• LINQ to SQL – работает, но с натяжкой.
• Entity Framework – да
• NHibernate – да.
12     Способы маппирования
• LINQ to SQL – через атрибуты.
• Entity Framework – через аттрибуты, XML
  файлы
• NHibernate – через аттрибуты, XML файлы,
  Fluent NHibernate.
13     Кэширование
• LINQ to SQL – Кэш 1-го уровня.
• Entity Framework – Кэш 1-го уровня. Кэш
  2-го уровня через обертки (
  http://code.msdn.microsoft.com/EFProviderWrappers
  )
• NHibernate – Есть кэши 1-го и 2-го уровня.
Кэш 1-го уровня
[Test]
public void trying_to_get_the_same_account_a_second_........... ()
{
         Console.WriteLine("------ now getting entity for the first time");
         var acc1 = Session.Get<Account>(account.Id);
         Console.WriteLine("------ now getting entity for the second time");
         var acc2 = Session.Get<Account>(account.Id); 
         acc1.ShouldBeTheSameAs(acc2);
}
Без кэша 2-го уровня
[Test]
public void trying_to_load_an_existing_item_twice_in_................. ()
{
  using(var session = SessionFactory.OpenSession())
  {
     var acc = session.Get<Account>(account.Id);
     acc.ShouldNotBeNull();
  }

    using(var session = SessionFactory.OpenSession())
    {
       var acc = session.Get<Account>(account.Id);
       acc.ShouldNotBeNull();
    }
}
Без кэша 2-го уровня
С кэшем 2-го уровня
[Test]
public void when_updating_the_entity_then_2nd_level.......... ()
{
  using(var session = SessionFactory.OpenSession())
  using (var tx = session.BeginTransaction())
  {
     var acc = session.Get<Account>(account.Id);
     acc.Credit(200m);
     tx.Commit();
  }

    using(var session = SessionFactory.OpenSession())
    {
       var acc = session.Get<Account>(account.Id);
       acc.Balance.ShouldEqual(1200m);
    }
}
С кэшем 2-го уровня
Провайдеры кэша 2-го
                        уровня
• Velocity: использует Microsoft Velocity (
  http://msdn.microsoft.com/en-us/data/cc655792.aspx)
• Prevalence: использует Bamboo.Prevalence (
  http://bbooprevalence.sourceforge.net/)
• SysCache: использует System.Web.Caching.Cache.
• SysCache2: подобно SysCache но с более продвинутуми
  настройками кэширования.
• MemCache: использует memcached (
  http://www.danga.com/memcached/).
• SharedCache: смотри (
  http://www.codeplex.com/SharedCache) и
  http://www.sharedcache.com/cms/
14    API
• LINQ to SQL и Entity Framework имеют
  менее богатый API чем NHibernate
• Например NHibernate имеет
  − Перехватчик запросов, вставки, удаления и
    обновления
  − Перехватчик создания объекта
  − Логгирование с использованием log4net.
Проблемы
• Скрытие БД ведёт к деградации производительности.
• Баги в библиотеке ведёт к нетривиальным методам
  решений.
• Иерархия классов может привести к блокировкам в БД и
  как следствие к деградации производительности.
• Загрузка классов, содержащие в полях экземпляры
  других (сохраняемых также через ORM) классов. Может
  привести к длительному процессу.
Заключение

• Каждый вправе выбирать ORM себе по
  вкусу. Так как нет универсального
  решения.
• Для маленьких проектов я бы предпочёл
  LINQ to SQL или Entity Framework.
• Для средних Entity Framework и
  NHibernate.
• Для больших только NHibernate.
Пожалуйста, Ваши Вопросы!!!

More Related Content

What's hot

Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ontico
 
Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Безопасность Node.js / Илья Вербицкий (Независимый консультант)Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Ontico
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
Roman Pavlushko
 
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
Ontico
 
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Ontico
 

What's hot (20)

Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
 
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
 
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
 
Антон Турецкий
Антон ТурецкийАнтон Турецкий
Антон Турецкий
 
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Безопасность Node.js / Илья Вербицкий (Независимый консультант)Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Безопасность Node.js / Илья Вербицкий (Независимый консультант)
 
My talk at Highload++ 2015
My talk at Highload++ 2015My talk at Highload++ 2015
My talk at Highload++ 2015
 
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013AVITO. Решаем проблемы по мере их поступления. Стачка 2013
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
 
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...
 
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
 
Как ускорить MySQL Handler Socket в 9 раз / Александр Яковлев (Мамба)
Как ускорить MySQL Handler Socket в 9 раз / Александр Яковлев (Мамба)Как ускорить MySQL Handler Socket в 9 раз / Александр Яковлев (Мамба)
Как ускорить MySQL Handler Socket в 9 раз / Александр Яковлев (Мамба)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Поиск наизнанку
Поиск наизнанкуПоиск наизнанку
Поиск наизнанку
 
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
 
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
 
Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"
 
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".
Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".
Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".
 

Viewers also liked

JEEConf-2013 Krivopustov
JEEConf-2013 KrivopustovJEEConf-2013 Krivopustov
JEEConf-2013 Krivopustov
knstvk
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Ontico
 
Sql azure federations
Sql azure federations Sql azure federations
Sql azure federations
Pavel Tsukanov
 

Viewers also liked (20)

Microsoft for developers open source and cross platform
Microsoft for developers  open source and cross platformMicrosoft for developers  open source and cross platform
Microsoft for developers open source and cross platform
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
Лекция 1. Введение в Android.
Лекция 1. Введение в Android.Лекция 1. Введение в Android.
Лекция 1. Введение в Android.
 
Object-Relational Mapping for Dummies
Object-Relational Mapping for DummiesObject-Relational Mapping for Dummies
Object-Relational Mapping for Dummies
 
EF6 or EF Core? How Do I Choose?
EF6 or EF Core? How Do I Choose?EF6 or EF Core? How Do I Choose?
EF6 or EF Core? How Do I Choose?
 
JEEConf-2013 Krivopustov
JEEConf-2013 KrivopustovJEEConf-2013 Krivopustov
JEEConf-2013 Krivopustov
 
Asp.Net MVC - Razor Syntax
Asp.Net MVC - Razor SyntaxAsp.Net MVC - Razor Syntax
Asp.Net MVC - Razor Syntax
 
Управление данными (sql)
Управление данными (sql)Управление данными (sql)
Управление данными (sql)
 
рентабельный код
рентабельный кодрентабельный код
рентабельный код
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
 
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
Как понять, что происходит на сервере? / Александр Крижановский (NatSys Lab.,...
 
Алгоритмы шифрования и их применение в .Net приложениях для защиты данных.
Алгоритмы шифрования и их применение в .Net приложениях для защиты данных.Алгоритмы шифрования и их применение в .Net приложениях для защиты данных.
Алгоритмы шифрования и их применение в .Net приложениях для защиты данных.
 
Введение в Knockout
Введение в Knockout Введение в Knockout
Введение в Knockout
 
Thinking in parallel ab tuladev
Thinking in parallel ab tuladevThinking in parallel ab tuladev
Thinking in parallel ab tuladev
 
SIGNALR - ОБМЕН СООБЩЕНИЯМИ В РЕАЛЬНОМ ВРЕМЕНИ
SIGNALR - ОБМЕН СООБЩЕНИЯМИ В РЕАЛЬНОМ ВРЕМЕНИSIGNALR - ОБМЕН СООБЩЕНИЯМИ В РЕАЛЬНОМ ВРЕМЕНИ
SIGNALR - ОБМЕН СООБЩЕНИЯМИ В РЕАЛЬНОМ ВРЕМЕНИ
 
Sql azure federations
Sql azure federations Sql azure federations
Sql azure federations
 
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVM
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVMKNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVM
KNOCKOUTJS КАК РЕАЛИЗАЦИЯ MVVM
 
Основы "мобильной" разработки на примере платформы iOs (iPhone)
Основы "мобильной" разработки на примере платформы iOs (iPhone)Основы "мобильной" разработки на примере платформы iOs (iPhone)
Основы "мобильной" разработки на примере платформы iOs (iPhone)
 
ЭЛЕМЕНТЫ ИСКУСТВЕННОГО ИНТЕЛЛЕКТА ПРИ ПРОГРАММИРОВАНИИ. (http://tuladev.net/e...
ЭЛЕМЕНТЫ ИСКУСТВЕННОГО ИНТЕЛЛЕКТА ПРИ ПРОГРАММИРОВАНИИ. (http://tuladev.net/e...ЭЛЕМЕНТЫ ИСКУСТВЕННОГО ИНТЕЛЛЕКТА ПРИ ПРОГРАММИРОВАНИИ. (http://tuladev.net/e...
ЭЛЕМЕНТЫ ИСКУСТВЕННОГО ИНТЕЛЛЕКТА ПРИ ПРОГРАММИРОВАНИИ. (http://tuladev.net/e...
 
RESPONSIVE WEB DESIGN
RESPONSIVE WEB DESIGNRESPONSIVE WEB DESIGN
RESPONSIVE WEB DESIGN
 

Similar to ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)

Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
DevDay
 
What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012
InTRUEdeR
 
Embarcadero All-Access
Embarcadero All-AccessEmbarcadero All-Access
Embarcadero All-Access
Serghei Urban
 
Проверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложенийПроверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложений
Media Gorod
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
Alex Chistyakov
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
IT-Portfolio
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
Stanfy
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayBuilding deployment pipeline - DevOps way
Building deployment pipeline - DevOps way
Andrey Rebrov
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
Nikolay Samokhvalov
 

Similar to ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework) (20)

Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
 
What's new in Visual Studio 2012
What's new in Visual Studio 2012What's new in Visual Studio 2012
What's new in Visual Studio 2012
 
Embarcadero All-Access
Embarcadero All-AccessEmbarcadero All-Access
Embarcadero All-Access
 
владивосток форум новости технологий 2015
владивосток форум новости технологий 2015владивосток форум новости технологий 2015
владивосток форум новости технологий 2015
 
Проверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложенийПроверено и работает. Инструменты Oracle для разработки веб приложений
Проверено и работает. Инструменты Oracle для разработки веб приложений
 
Sivko
SivkoSivko
Sivko
 
Sql server clr integration
Sql server clr integration Sql server clr integration
Sql server clr integration
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
Net core and linux in production
Net core and linux in productionNet core and linux in production
Net core and linux in production
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
Приватный клауд на базе OpenStack
Приватный клауд на базе OpenStackПриватный клауд на базе OpenStack
Приватный клауд на базе OpenStack
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
 
Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++
 
Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"Владимир Никонов "Вызовы при разработке enterprise продукта"
Владимир Никонов "Вызовы при разработке enterprise продукта"
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayBuilding deployment pipeline - DevOps way
Building deployment pipeline - DevOps way
 
SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101SETCON'18 - Vitali Fokin - Kubernetes 101
SETCON'18 - Vitali Fokin - Kubernetes 101
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
Errors Tracker
Errors TrackerErrors Tracker
Errors Tracker
 

More from Pavel Tsukanov

РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВРАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
Pavel Tsukanov
 

More from Pavel Tsukanov (20)

Автоматизированное тестирование UI на C# + Selenium WebDriver
Автоматизированное тестирование UI на C# + Selenium WebDriverАвтоматизированное тестирование UI на C# + Selenium WebDriver
Автоматизированное тестирование UI на C# + Selenium WebDriver
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
МАШИННОЕ ЗРЕНИЕ С ИСПОЛЬЗОВАНИЕ OPENCV
МАШИННОЕ ЗРЕНИЕ С ИСПОЛЬЗОВАНИЕ OPENCVМАШИННОЕ ЗРЕНИЕ С ИСПОЛЬЗОВАНИЕ OPENCV
МАШИННОЕ ЗРЕНИЕ С ИСПОЛЬЗОВАНИЕ OPENCV
 
CONTINUOUS INTEGRATION ДЛЯ ЧАЙНИКОВ ВМЕСТЕ С TEAMCITY
CONTINUOUS INTEGRATION ДЛЯ ЧАЙНИКОВ ВМЕСТЕ С TEAMCITYCONTINUOUS INTEGRATION ДЛЯ ЧАЙНИКОВ ВМЕСТЕ С TEAMCITY
CONTINUOUS INTEGRATION ДЛЯ ЧАЙНИКОВ ВМЕСТЕ С TEAMCITY
 
СОЗДАЙ РОБОТА С НУЛЯ
СОЗДАЙ РОБОТА С НУЛЯСОЗДАЙ РОБОТА С НУЛЯ
СОЗДАЙ РОБОТА С НУЛЯ
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
Лекция Android
Лекция AndroidЛекция Android
Лекция Android
 
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
 
АНИМАЦИЯ В FLASH И HTML5
АНИМАЦИЯ В FLASH И HTML5АНИМАЦИЯ В FLASH И HTML5
АНИМАЦИЯ В FLASH И HTML5
 
РАЗРАБОТКА ПО С ИСПОЛЬЗОВАНИЕМ FINITE STATE MACHINE.
РАЗРАБОТКА ПО С ИСПОЛЬЗОВАНИЕМ FINITE STATE MACHINE.РАЗРАБОТКА ПО С ИСПОЛЬЗОВАНИЕМ FINITE STATE MACHINE.
РАЗРАБОТКА ПО С ИСПОЛЬЗОВАНИЕМ FINITE STATE MACHINE.
 
ХАКЕРЫ И АНТИХАКЕРЫ
ХАКЕРЫ И АНТИХАКЕРЫХАКЕРЫ И АНТИХАКЕРЫ
ХАКЕРЫ И АНТИХАКЕРЫ
 
ЗАРАБОТОК В ИНТЕРНЕТЕ.
ЗАРАБОТОК В ИНТЕРНЕТЕ.ЗАРАБОТОК В ИНТЕРНЕТЕ.
ЗАРАБОТОК В ИНТЕРНЕТЕ.
 
РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВРАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
РАЗРАБОТКА МОБИЛЬНЫХ САЙТОВ
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 
Реализация REST и SOAP сервисов с помощью WCF
Реализация REST и SOAP сервисов с помощью WCFРеализация REST и SOAP сервисов с помощью WCF
Реализация REST и SOAP сервисов с помощью WCF
 
Как писать красивый код или основы SOLID
Как писать красивый код или основы SOLIDКак писать красивый код или основы SOLID
Как писать красивый код или основы SOLID
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
PaaS и SaaS
PaaS и SaaSPaaS и SaaS
PaaS и SaaS
 
TDD (Test-driven Development) как стиль разработки.
TDD (Test-driven Development) как стиль разработки.TDD (Test-driven Development) как стиль разработки.
TDD (Test-driven Development) как стиль разработки.
 
Применение нейронных сетей и генетических алгоритмов при торговле на бирже.
Применение нейронных сетей и генетических алгоритмов при торговле на бирже. Применение нейронных сетей и генетических алгоритмов при торговле на бирже.
Применение нейронных сетей и генетических алгоритмов при торговле на бирже.
 

ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)

  • 1. ORM На примерах NHibernate, Entity Framework, LINQ to SQL Цуканов Павел ptsukanov@codereign.net Skype: cpp.tula
  • 2. ORM это • Object Relational Mapping = Объектно- ориентированная проекция (отображение) • А если проще. Это возможность без больших затрат сохранять/считывать объекты в базе данных
  • 5. А зачем это надо • Меньше кода. • Нет небходимости самому писать SQL запросы. • Нет необходимости самому создавать объекты. • Можно работать с имеющимся доменными/бизнес объектами. • В конечном итоге это проще сопровождать.
  • 6. 5 причин использовать ORM • Сокращает время разработки. • Позволяет создать более лучший код. • Нет необходимости быть экспертом .NET, что-бы использовать ORM. • Сокращает время тестирования. • Упрощает сопровождение.
  • 7. Сокращает время разработки • Сокращает вам кучу времени на разработку от 20% до 50% (в зависимости от проектов). • Типично для 15-20 таблиц это 30-50 объектов, а это примерно от 5000 до 10000 строк кода. И это надо написать и протестировать. • С ORM тоже можно сделать за 1-2 дня. Причём основное время потребуется на обдумывание как осуществить маппирование корректно.
  • 8. Позволяет создать более лучший код. • Разные люди в команде могут создать свой уникальный код для преобразования объектов из/в БД, опираясь исключительно на свой опыт. • ORM использует шаблоны кода, которые имеют отличный дизайн. Причем, эти шаблоны кода почти всегда следуют известным шаблонам проектирования. Таким образом, код, который вы будете получать от ORM очень вероятно, будет лучше разработаны, чем код, разработанный собственной командой.
  • 9. Нет необходимости быть экспертом .NET, что-бы использовать ORM. • Вы можете начать использовать ORM очень быстро имея лишь поверхностные знания. • Удивительно, но это факт, подчеркнутый из собственного опыта. • При этом ваш код не будет сильно отличаться от экспертов в этом вопросе. • Хотя конечно, есть и подводные камни.
  • 10. Сокращает время тестирования. • Вам нет необходимости вручную преобразовывать объекты из/в базу данных. А следовательно нет необходимости тестировать того чего нет. • Код который делает такое преобразование написан за вас и уже протестирован.
  • 11. Упрощает сопровождение. • Жизнь программы не заканчивается выпуском релиза. Она живёт и развивается и изменение кода в случае с ORM менее затратное занятие. Так как вы написали меньше кода • Разработчик знающий как функционирует та или иная ORM может без проблем переключится с проекта на проект и понять как тут всё устроено.
  • 12. Что у нас есть • LINQ to SQL ( http://msdn.microsoft.com/en-en/library/bb386976.aspx ) • Entity Framework ( http://msdn.microsoft.com/en-en/library/bb399572.aspx ) • Nhibernate (http://nhforge.org) • eXpressPersistent Objects™ ( http://www.devexpress.com/products/NET/XPO) • LLBLGen Pro (http://www.llblgen.com) • Dapper.NET ( http://code.google.com/p/dapper-dot-net/)(ORM сайта StackOverflow).
  • 13. LINQ to SQL • Входит в состав .Net Framework начиная с 3.5. • Разработано спецально для работы с MSSQL сервером через LINQ. • Отказано в развитии.
  • 14. Entity Framework • Входит в состав .Net Framework начиная с 3.5 • С .Net Framework 4.0 это рекомендуемый способ доступа к БД через Linq • Последняя версия 5.0 находится в бетта версии и будет доступна с .Net Framework 4.5
  • 15. • ORM-решение для платформы Microsoft .NET портированное с Java. • Бесплатная библиотека модно найти на http://nhforge.org • Последняя версия 3.2
  • 17. 1 Сложность • LINQ to SQL – Самая лёгкая и простая • Entity Framework – Более сложная. Визуальный интерфейс позволяет сделать сложные вещи очень просто. • NHibernate – Наиболее продвинутая ORM из вышеперечисленных
  • 18. 2 Наследование • LINQ to SQL – Table per Class Hierarchy (TPH). • Entity Framework – несколько видов наследования Table per Class Hierarchy (TPH), Table per Type (TPT), and Table per Concrete Class (TPC). • NHibernate – дополнительно к NHibernate - Implicit polymorphism
  • 19. TPH (Table per Class Hierarchy )
  • 20. TPT (Table per Type)
  • 21. TPC (Table per Concrete Class)
  • 22. Implicit polymorphism public static List<Object> GetAll() { List<Object> objects = session.find(“from Object”); return objects; }
  • 23. 3 Поддержка БД • LINQ to SQL – MSSQL2000 и старше. • Entity Framework – MSSQL, IBM DB2, Sybase SqlAnywhere, Oracle, SQL Azure и многие другие. Главное чтобы был ADO.Net Data provider для соответствующей БД. • NHibernate – Microsoft SQL Server 2005/2000, Oracle, Microsoft Access, Firebird, PostgreSQL, DB2 UDB, MySQL, SQLite. Определяется наличием соответствующего драйвера у NHibernate.
  • 24. 4 Сложность разработки • LINQ to SQL – прост в обучении и при разработке простых приложений. • Entity Framework – более сложная библиотека и требует время на изучение всех ньюансов. Рекомендуется как для простых так и сложных приложений. • NHibernate – Достаточно сложная в изучении чем Entity Framework. Однако гибкость конфигурирования позволяет легко сопровождать приложения. Рекомендую для сложных проектов.
  • 25. Типы используемых 5 файлов • LINQ to SQL – файл DBML – содержит XML маппинг классов к таблицам • Entity Framework – обычно EDMX файл генерируется во время разработки. Остальные CSDL, SSDL, MSL файлы во время компиляции. • NHibernate – XML файлы конфигурации.
  • 26. Поддержка комплексных 6 типов • LINQ to SQL – нет • Entity Framework – да • NHibernate – нет.
  • 27. 7 Поддержка LINQ • LINQ to SQL – да. Основной способ работы с базой данных. • Entity Framework – да. Основной способ работы с базой данных. • NHibernate – да, но в ограниченном объёме (во всяком случае в NH 2.0).
  • 28. 8 Производительность • Cчитается что как ни странно Entity Framework – быстрее чем LINQ to SQL. • NHibernate – позволяет добиться более высокой производительности при более тонкой настройке.
  • 29. 9 Будущее библиотек • LINQ to SQL – не развивается. • Entity Framework – активно развивается и конечном итоге дожна заменить LINQ to SQL. • NHibernate – развивается пока есть энтузиасты.
  • 30. Генерация кода из БД и 10 наоборот • LINQ to SQL – генерирует классы из БД. • Entity Framework – генерирует классы из БД и наоборот • NHibernate – всё ручками.
  • 31. Работа с POCO (Plain Old CLR 11 Objects) объектами • LINQ to SQL – работает, но с натяжкой. • Entity Framework – да • NHibernate – да.
  • 32. 12 Способы маппирования • LINQ to SQL – через атрибуты. • Entity Framework – через аттрибуты, XML файлы • NHibernate – через аттрибуты, XML файлы, Fluent NHibernate.
  • 33. 13 Кэширование • LINQ to SQL – Кэш 1-го уровня. • Entity Framework – Кэш 1-го уровня. Кэш 2-го уровня через обертки ( http://code.msdn.microsoft.com/EFProviderWrappers ) • NHibernate – Есть кэши 1-го и 2-го уровня.
  • 34. Кэш 1-го уровня [Test] public void trying_to_get_the_same_account_a_second_........... () { Console.WriteLine("------ now getting entity for the first time"); var acc1 = Session.Get<Account>(account.Id); Console.WriteLine("------ now getting entity for the second time"); var acc2 = Session.Get<Account>(account.Id);  acc1.ShouldBeTheSameAs(acc2); }
  • 35. Без кэша 2-го уровня [Test] public void trying_to_load_an_existing_item_twice_in_................. () { using(var session = SessionFactory.OpenSession()) { var acc = session.Get<Account>(account.Id); acc.ShouldNotBeNull(); } using(var session = SessionFactory.OpenSession()) { var acc = session.Get<Account>(account.Id); acc.ShouldNotBeNull(); } }
  • 36. Без кэша 2-го уровня
  • 37. С кэшем 2-го уровня [Test] public void when_updating_the_entity_then_2nd_level.......... () { using(var session = SessionFactory.OpenSession()) using (var tx = session.BeginTransaction()) { var acc = session.Get<Account>(account.Id); acc.Credit(200m); tx.Commit(); } using(var session = SessionFactory.OpenSession()) { var acc = session.Get<Account>(account.Id); acc.Balance.ShouldEqual(1200m); } }
  • 38. С кэшем 2-го уровня
  • 39. Провайдеры кэша 2-го уровня • Velocity: использует Microsoft Velocity ( http://msdn.microsoft.com/en-us/data/cc655792.aspx) • Prevalence: использует Bamboo.Prevalence ( http://bbooprevalence.sourceforge.net/) • SysCache: использует System.Web.Caching.Cache. • SysCache2: подобно SysCache но с более продвинутуми настройками кэширования. • MemCache: использует memcached ( http://www.danga.com/memcached/). • SharedCache: смотри ( http://www.codeplex.com/SharedCache) и http://www.sharedcache.com/cms/
  • 40. 14 API • LINQ to SQL и Entity Framework имеют менее богатый API чем NHibernate • Например NHibernate имеет − Перехватчик запросов, вставки, удаления и обновления − Перехватчик создания объекта − Логгирование с использованием log4net.
  • 41. Проблемы • Скрытие БД ведёт к деградации производительности. • Баги в библиотеке ведёт к нетривиальным методам решений. • Иерархия классов может привести к блокировкам в БД и как следствие к деградации производительности. • Загрузка классов, содержащие в полях экземпляры других (сохраняемых также через ORM) классов. Может привести к длительному процессу.
  • 42. Заключение • Каждый вправе выбирать ORM себе по вкусу. Так как нет универсального решения. • Для маленьких проектов я бы предпочёл LINQ to SQL или Entity Framework. • Для средних Entity Framework и NHibernate. • Для больших только NHibernate.