NHibernate что, где, когда Артур Дробинский ЗетаСофт Томск, 2012 Способы работы с БД из .NET • ADO.Net – DataSet/DataReader • Linq2SQL • ORM Object-Relational Mapper public class BaseEntity { public virtual int Id { get; set; } } public class User : BaseEntity { public virtual string Login { get; set; } public virtual string FirstName { get; set; } public virtual string LastName { get; set; } } public class Topic : BaseEntity { public virtual string Title { get; set; } public virtual User Creator { get; set; } public virtual IList<Message> Messages { get; } } public class Message : BaseEntity { public virtual Topic Topic { get; set; } public virtual string Text { get; set; } public virtual DateTime DateTime { get; set; public virtual User Author { get; set; } } Object-Relational Mapper var connection = SessionConstructor.OpenConnection(); var command = connection.CreateCommand(); command.CommandText = @"SELECT TOP 5 * FROM [Message] INNER JOIN [User] Author ON Author.Id = [Message].Author_Id WHERE Author.Login='Shaddix' ORDER BY [Message].[DateTime] DESC"; var reader = command.ExecuteReader(); var result = new List<object>(); while (reader.Read()) { result.Add(new { Text = reader["Text"], Id = reader["Id"] }); } var session = SessionConstructor.OpenSession(); var data = session.Query<Message>() .Where(x => x.Author.Login == "Shaddix") .OrderByDescending(x => x.DateTime) .Take(5) .ToList(); Плюсы ORM • • • • • • • Работа с классами удобнее, чем с DataSet Проектирование на уровне классов Отсутствие «переключений контекста» Строгая типизация при работе с БД Удобные инструменты работы (профилирование, кэширование, миграции, etc) Использование знаний в LINQ вместо изучения SQL Ускорение разработки Существующие ORM • Микро-ОРМ • • • • Dapper.NET Massive PetaPoco + маленькие + базовый ORM-функционал + простые, старый-добрый SQL Полнофункциональные ORM • • • NHibernate Entity Framework LLBLGen + linq-запросы + БД-независимость + сложные сценарии маппинга (наследование/компоненты/связи) + кэширование/оптимизация запросов Подходы при работе с ORM • Database-First • Code-First Маппинги в NHibernate public class BaseEntity { public virtual int Id { get; protected set;} } public class User : BaseEntity { public virtual string Login { get; set; } public virtual string FirstName { get; set; } public virtual string LastName { get; set; } } • • • NHibernate и *.hbm.xml FluentNHibernate и отсутствие всех этих ужастиков (Convention over Configuration) Здесь мы смотрим примеры Вопросы?! Артур Дробинский ЗетаСофт, Томск http://arturdr.ru [email protected] Всем спасибо за внимание Успехов! Артур Дробинский ЗетаСофт, Томск http://arturdr.ru [email protected]