NHibernate Natalie Vegerina Software engineer Infostroy Ltd, Kharkov,
NHibernate Natalie Vegerina Software engineer Infostroy Ltd, Kharkov, Ukraine
Схема базы данных
Маппинг Xml Attributes ConfORM Fluent NHibernate Auto mapping
Xml-Маппинг
Xml-маппинг xml version="1.0" encoding="utf-8" ?>
Xml-маппинг. Id
Xml-маппинг. Id
Xml-маппинг. Id Атрибуты: name type sql-type column length not-null
Xml-маппинг. Id Генераторы: hilo guid guid.comb guid.native uuid.hex uuid.string counter increment sequence seqhilo native assigned identity foreign
Xml-маппинг. Property
Xml-маппинг. Property
Схема базы данных
Xml-маппинг. Many-to-one
Xml-маппинг. One-to-many
Xml-маппинг. One-to-many Cascade-типы: none save-update delete delete-orphan all all-delete-orphan
Xml-маппинг. One-to-many Типы коллекций
Схема базы данных
Xml-маппинг. Many-to-many
Fluent-Маппинг
Fluent-маппинг public class ProductMap : ClassMap
Fluent-маппинг. Основные настройки Table("tbl_Product"); Schema("OrderingSystem"); Not.LazyLoad();
Fluent-маппинг. Id Id(x => x.ID) .GeneratedBy.HiLo("1000");
Fluent-маппинг. Id Id(x => x.ID) .Column("PRODUCT_ID") .GeneratedBy.HiLo("1000") .UnsavedValue(-1);
Fluent-маппинг. Property Map(x => x.Name);
Fluent-маппинг. Property Map(x => x.Name, "PRODUCT_NAME") .Length(50) .Not.Nullable();
Fluent-маппинг. Enum public enum ProductTypes { ProductTypeA /*...*/ } public class Product : Entity
Fluent-маппинг. Many-to-one References(x => x.Customer) .Not.Nullable() .ForeignKey("CustomerId") .Unique();
Fluent-маппинг. One-to-many HasMany(x => x.LineItems) .Inverse() .Cascade.AllDeleteOrphan() .Where(x => x.Discount > 0) .AsList();
Fluent-маппинг. Many-to-many public class Order : Entity
Auto mapping
Конвенция таблицы public class TableNameConvention : IClassConvention { public void Apply(IClassInstance instance) { string typeName = instance.EntityType.Name; instance.Table(typeName.ToUpper() + "S"); } }
Конвенция Id public class IdConvention : IIdConvention { public void Apply(IIdentityInstance instance) { instance.Column("Id"); instance.GeneratedBy.Sequence(string.Format("Sequence_{0}", instance.EntityType.Name)); instance.UnsavedValue("0"); } }
Конвенция свойства public class ColumnConvention : IPropertyConvention { public void Apply(IPropertyInstance instance) { if(instance.Property.Name == "Name") { instance.Not.Nullable(); instance.Length(50); } } }
Конвенция свойства с атрибутом public class MaxLengthConvention : AttributePropertyConvention
Конвенция свойства с атрибутом public class NotRequiredConvention : AttributePropertyConvention
Конвенция внешнего ключа public class CustomForeignKeyConvention: ForeignKeyConvention { protected override string GetKeyName(Member property, Type type) { if (property == null) { return type.Name + "Id"; // many-to-many, one-to-many, join } return property.Name + "Id"; // many-to-one } }
Конвенция many-to-one public class ReferenceConvention : IReferenceConvention { public void Apply(IManyToOneInstance instance) { instance.Cascade.None(); instance.LazyLoad(Laziness.Proxy); instance.Column(instance.Property.Name + "Id"); } }
Конвенция one-to-many public class OneToManyConvention : IHasManyConvention { public void Apply(IOneToManyCollectionInstance instance) { instance.Cascade.None(); instance.Inverse(); instance.LazyLoad(); } }
NHibernate
Обязательные настройки
Настройка NHibernate Типы настроек: config-файл xml-файл В коде Fluent ConfORM
Настройка Nhibernate. Config-файл
Настройка Nhibernate. Фабрика сессий public class DbSessionFactory : IDisposable { private static DbSessionFactory instance; private ISessionFactory factory; static DbSessionFactory() { instance = new DbSessionFactory(); } public static DbSessionFactory Instance { get { return instance; } }
Настройка Nhibernate. Фабрика сессий public ISession OpenSession() { return this.factory.OpenSession(); } public void Close() { if (this.factory != null) { this.factory.Close(); this.factory = null; } } public void Dispose() { this.Close(); }
Настройка Nhibernate. Фабрика сессий public bool CreateFactory(string connectionString) { Configuration configuration = BuildConfiguration(connectionString); try { this.factory = configuration.BuildSessionFactory(); } catch (Exception ex) { // manage exception } return this.factory != null; }
Настройка Nhibernate. Config-файл, xml-маппинг private static Configuration BuildConfiguration(string connectionString) { Configuration configuration = new Configuration(); configuration.AddAssembly(Assembly.GetAssembly(typeof(Product))); return configuration; }
Настройка Nhibernate. Код, xml-маппинг private static Configuration BuildConfiguration(string connectionString) { Configuration configuration = new Configuration(); configuration.DataBaseIntegration(dbi => { dbi.Dialect
Настройка Nhibernate. Fluent private static Configuration BuildConfiguration(string connectionString) { Configuration configuration = Fluently.Configure() .Database(MsSqlConfiguration.MsSql2008 .ConnectionString(connectionString)) .Mappings(mappings => mappings.FluentMappings .AddFromAssemblyOf
Настройка Nhibernate. Fluent, автоматический маппинг private static Configuration BuildConfiguration(string connectionString) { Configuration configuration = new Configuration(); AutoPersistenceModel model = new AutoPersistenceModel(); model = AutoMap.Assemblies(Assembly.GetAssembly(typeof(Product))); model.OverrideAll(x => x.IgnoreProperties(y => y.Name.StartsWith("Tmp_"))); model.IgnoreBase
Настройка Nhibernate. Web public static ISession CurrentDbSession { get { HttpContext context = HttpContext.Current; ISession session = (ISession)context.Items["nhibernate.current_session"]; if (session == null) { session = DbSessionFactory.Instance.OpenSession(); context.Items["nhibernate.current_session"] = session; } return (ISession)context.Items["nhibernate.current_session"]; } }
Настройка Nhibernate. Web public static void CloseCurrentSession() { HttpContext context = HttpContext.Current; ISession session = (NHibernate.ISession)context.Items["nhibernate.current_session"]; if (session != null) { session.Close(); context.Items.Remove("nhibernate.current_session"); } }
Литература Benjamin Perkins - Working with Nhibernate 3.0 Jason Dentler – Nhibernate 3.0. Cookbook Dr. Gabriel Nicolas Schenker, Aaron Cure – Nhibernate 3. Beginners guide Nhibernate - http://www.nhforge.org/ NHibernate - http://ayende.com/blog Fluent NHibernate - http://wiki.fluentnhibernate.org/
30582-my_nhibernate.ppt
- Количество слайдов: 52