SlideShare a Scribd company logo
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.
Пожалуйста, Ваши Вопросы!!!
Ad

Recommended

PPTX
Micro orm для жизни. Кожевников Дмитрий D2D Just.NET
Dev2Dev
 
PPTX
Dapper + QueryObject
Alexander Byndyu
 
PPTX
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Ontico
 
PDF
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
PDF
Андрей Ситник
CodeFest
 
PDF
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Ontico
 
PDF
Вячеслав Бахмутов
CodeFest
 
PDF
Zabbix в Badoo или о чем не пишут в мануале, Илья Аблеев (Badoo)
Badoo Development
 
PPTX
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Николай Лавлинский
 
PDF
Android Cloud... точнее Cloud из Android / Охрименко Алексей (Acronis)
Ontico
 
PPTX
Ошибки проектирования высоконагруженных проектов / Максим Ехлаков (OneTwoRent)
Ontico
 
PPTX
Антон Турецкий
CodeFest
 
PPTX
Приключения проекта от компьютера разработчика до серьезных нагрузок / Андрей...
Ontico
 
PDF
Обзор перспективных баз данных для highload / Юрий Насретдинов
Ontico
 
PPTX
Безопасность Node.js / Илья Вербицкий (Независимый консультант)
Ontico
 
PDF
My talk at Highload++ 2015
Alex Chistyakov
 
PDF
AVITO. Решаем проблемы по мере их поступления. Стачка 2013
Roman Pavlushko
 
PPTX
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Anton Baranov
 
PPTX
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
Ontico
 
PPTX
Как ускорить MySQL Handler Socket в 9 раз / Александр Яковлев (Мамба)
Ontico
 
PPTX
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
PPTX
Поиск наизнанку
Nikolay Sivko
 
PDF
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Ontico
 
PDF
Высокопроизводительная и отказоустойчивая архитектура фронтальных систем / Ма...
Ontico
 
PDF
Anton Tsitou "Cycle ORM and Graphs"
Fwdays
 
PDF
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Ontico
 
PDF
Денис Иванов
CodeFest
 
PDF
Доклад Ильи Аблеева на DevOps Meetup "Мониторинг высоконагруженного проекта".
Badoo Development
 
PPTX
Microsoft for developers open source and cross platform
Julie Lerman
 
PPTX
Язык программирования C#
Dmitri Soshnikov
 

More Related Content

What's hot (20)

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

Viewers also liked (20)

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

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

PPT
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
DevDay
 
PPTX
What's new in Visual Studio 2012
InTRUEdeR
 
PPT
Embarcadero All-Access
Serghei Urban
 
PDF
владивосток форум новости технологий 2015
Elena Ometova
 
PPT
Проверено и работает. Инструменты Oracle для разработки веб приложений
Media Gorod
 
PDF
Sivko
kuchinskaya
 
PPTX
Sql server clr integration
Alex Tumanoff
 
PPTX
Daemons In Web on #devrus
Alex Chistyakov
 
PPTX
Net core and linux in production
Anatoly Popov
 
PDF
How to cook a blockchain and not get burned
Alexander Syrotenko
 
PDF
Приватный клауд на базе OpenStack
Ilya Alekseyev
 
PPTX
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
IT-Portfolio
 
PDF
И снова разработка под iOS. Павел Тайкало
Stanfy
 
PDF
Seminar: Эффективное использование среды разработки и компилятора C++
Denis Vasilyev
 
PPT
Владимир Никонов "Вызовы при разработке enterprise продукта"
Fwdays
 
PDF
Building deployment pipeline - DevOps way
Andrey Rebrov
 
PDF
SETCON'18 - Vitali Fokin - Kubernetes 101
Nadzeya Pus
 
PPTX
2014.12.23 Александр Андреев, Parallels
Nikolay Samokhvalov
 
PDF
IT-инфраструктура. FAQ для разработчика
Mikhail Chinkov
 
PPTX
Errors Tracker
Alexei Yuzhakov
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
DevDay
 
What's new in Visual Studio 2012
InTRUEdeR
 
Embarcadero All-Access
Serghei Urban
 
владивосток форум новости технологий 2015
Elena Ometova
 
Проверено и работает. Инструменты Oracle для разработки веб приложений
Media Gorod
 
Sql server clr integration
Alex Tumanoff
 
Daemons In Web on #devrus
Alex Chistyakov
 
Net core and linux in production
Anatoly Popov
 
How to cook a blockchain and not get burned
Alexander Syrotenko
 
Приватный клауд на базе OpenStack
Ilya Alekseyev
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
IT-Portfolio
 
И снова разработка под iOS. Павел Тайкало
Stanfy
 
Seminar: Эффективное использование среды разработки и компилятора C++
Denis Vasilyev
 
Владимир Никонов "Вызовы при разработке enterprise продукта"
Fwdays
 
Building deployment pipeline - DevOps way
Andrey Rebrov
 
SETCON'18 - Vitali Fokin - Kubernetes 101
Nadzeya Pus
 
2014.12.23 Александр Андреев, Parallels
Nikolay Samokhvalov
 
IT-инфраструктура. FAQ для разработчика
Mikhail Chinkov
 
Errors Tracker
Alexei Yuzhakov
 
Ad

More from Pavel Tsukanov (20)

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

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

  • 1. ORM На примерах NHibernate, Entity Framework, LINQ to SQL Цуканов Павел [email protected] 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.