100 likes | 213 Views
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 {
E N D
NHibernateчто, где, когда АртурДробинский ЗетаСофт Томск, 2012
Способы работы с БДиз .NET • ADO.Net – DataSet/DataReader • Linq2SQL • ORM
Object-Relational Mapper publicclassBaseEntity { publicvirtualint Id { get; set; } } publicclassUser : BaseEntity { publicvirtualstring Login { get; set; } publicvirtualstring FirstName { get; set; } publicvirtualstring LastName { get; set; } } publicclassTopic : BaseEntity { publicvirtualstring Title { get; set; } publicvirtualUser Creator { get; set; } publicvirtualIList<Message> Messages { get; set; } } publicclassMessage : BaseEntity { publicvirtualTopic Topic { get; set; } publicvirtualstring Text { get; set; } publicvirtualDateTime DateTime { get; set; } publicvirtualUser 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 = newList<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 • NHibernate • Entity Framework • LLBLGen + маленькие + базовый ORM-функционал + простые, старый-добрыйSQL + linq-запросы + БД-независимость + сложные сценарии маппинга (наследование/компоненты/связи) + кэширование/оптимизация запросов
Подходы при работе с ORM • Database-First • Code-First
Маппинги в NHibernate publicclassBaseEntity { publicvirtualint Id { get; protected set;} } publicclassUser : BaseEntity { publicvirtualstring Login { get; set; } publicvirtualstring FirstName { get; set; } publicvirtualstring LastName { get; set; } } • NHibernateи *.hbm.xml • FluentNHibernateи отсутствие всех этих ужастиков (Convention over Configuration) • Здесь мы смотрим примеры
Вопросы?! Артур Дробинский ЗетаСофт, Томск http://arturdr.ru artur.drobinskiy@gmail.com
Всем спасибо за вниманиеУспехов! Артур Дробинский ЗетаСофт, Томск http://arturdr.ru artur.drobinskiy@gmail.com