标签:
上篇文章详细讨论了FluentNHibernate的基本映射的使用方法,它的映射基本用法是跟NHibernate完全一样的,首先要创建数据库链接配置文件,然后编写Table的Mapping,最后编写Unit Test来测试模块Mapping是否成功执行。FluentNHibernate之所以替代NHibernate并不仅仅是因为对Mapping配置文件的优化,另外它换可以优化数据库的链接xml以及规避Mapping文件的编写,这种完全自动化的编程方法就是AutoMapping,FluentNHibernate封装了自动化映射的方法,使得开发人员只需要几种到对Table的修改中,而不需要考虑数据模型到对象模型的转化过程。(3)编写Unit Test运行AutoMapping的配置文件,生成NHibernate的映射xml,查看映射是否成功。
AutoMapping的配置文件在创建Session时首先要创建AutoPersistenceModel对象,也就是将实体类所在的程序集/命名空间及Entity到Table的映射规则注册到 FluentNHibernate的AutoMapping中,具体的代码如下:
/// <summary> /// 继承默认的AutoMapping配置类 /// 重写ShouldMap方法指定映射Entity所在的命名空间 /// </summary> public class StoreConfiguration : DefaultAutomappingConfiguration { public override bool ShouldMap(Type type) { return type.Namespace == "ClassLibrary1.mapping"; } } /// <summary> /// 创建SessionFactory /// </summary> public class Build { private static AutoPersistenceModel CreateAutomappings() { //AutoMap.Assembly(Assembly.Load("ClassLibrary1"), new StoreConfiguration()) //添加需要映射的程序集,在添加时可以使用默认的DefaultAutomappingConfiguration也可以继承该类重写ShouldMap方法来指定映射的命名空间 return AutoMap .Assembly(Assembly.Load("ClassLibrary1"), new StoreConfiguration()) //Conventions.Setup()方法是将映射的具体规则绑定到AutoMapping配置中,如下配置了: //DefualtTableNameConvertion默认表命名方式 //DefaultPrimarykeyConvention默认主键命名方式 //DefualtStringLengthConvertion默认的字符串长度 //DefaultReferenceConvention默认的外键创建方法 //DefaultHasManyConvention默认的一对多的创建方法 //DefualtHasOneConvertion默认的一对一的创建方法 //HasManyToManyConvention默认的多对多的创建方法 .Conventions.Setup(con => { con.Add<DefualtTableNameConvertion>(); con.Add<DefaultPrimarykeyConvention>(); con.Add<DefualtStringLengthConvertion>(); con.Add<DefaultReferenceConvention>(); con.Add<DefaultHasManyConvention>(); con.Add<DefualtHasOneConvertion>(); con.Add<HasManyToManyConvention>(); }); } public ISessionFactory CreateSessionFactory() { return Fluently .Configure() //创建或者指定数据库的配置xml,这里使用的是自动创建的方法 //指定数据库的映射方法,其实它的底层使用的是反射来实现的映射 .Database( MsSqlConfiguration .MsSql2005 .ConnectionString( "Data Source=.;Initial Catalog=Mapping;Integrated Security=true;Pooling=True;Min Pool Size=20;Max Pool Size=60") //指定连接字符串 .ShowSql() ) //配置映射规则 .Mappings(m => m.AutoMappings.Add(CreateAutomappings()) //将创建的AutoPersistenceModel对象添加到AutoMapping中 .ExportTo("c:\\path") //导出映射文件 ) //生成数据库架构 //new SchemaExport(cfg).Create(true, false)创建配置文件。 //这里的Create方法是创建的脚本文件的映射方法, //第一个参数bool script指定是否生成数据库脚本 //第二个参数bool export指定每次生成的数据库的创建脚本是否执行 .ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, false)) .BuildSessionFactory(); } }
public class DefualtTableNameConvertion : IClassConvention { /// <summary> /// 指定生成的表名或者表名到对象的映射 /// </summary> /// <param name="instance">需要映射的Entity对象</param> public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance) { //定义生成表名的规则,实体类名+s instance.Table(instance.EntityType.Name + "s"); } }
public class DefaultPrimarykeyConvention : IIdConvention { /// <summary> /// 指定Entity Class到Table ID的生成规则,及ID的规则 /// </summary> /// <param name="instance">生成实体的对象</param> public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance) { instance.Column(instance.EntityType.Name + "ID"); instance.GeneratedBy.Native(); } }
public class DefaultReferenceConvention : IReferenceConvention { /// <summary> /// 指定对象外键的生成规则 /// </summary> /// <param name="instance">外键对象</param> public void Apply(IManyToOneInstance instance) { instance.Column(instance.Name + "ID"); instance.LazyLoad(); } }
public class DefualtStringLengthConvertion : IPropertyConvention { /// <summary> /// 配置Table列的名称及类型 /// </summary> /// <param name="instance">对象的属性</param> public void Apply(FluentNHibernate.Conventions.Instances.IPropertyInstance instance) { //设置列的字符串长度为50 instance.Length(50); } }
public class DefualtHasOneConvertion : IHasOneConvention { /// <summary> /// 一对一映射中的外键列及对从表的操作的类型 /// </summary> /// <param name="instance">关系对象</param> public void Apply(IOneToOneInstance instance) { //指定外键列的列名规则 instance.ForeignKey(instance.EntityType.Name + "ID"); //指定主表对从表的操作 instance.Cascade.SaveUpdate(); instance.LazyLoad(); } }
public class DefaultHasManyConvention : IHasManyConvention { /// <summary> /// 一对多对象的生成规则 /// </summary> /// <param name="instance"></param> public void Apply(IOneToManyCollectionInstance instance) { instance.Key.Column(instance.EntityType.Name + "ID"); instance.Cascade.AllDeleteOrphan(); instance.LazyLoad(); } }(7)IHasManyToManyConvention
public class HasManyToManyConvention : IHasManyToManyConvention { /// <summary> /// 多对多映射的规则 /// </summary> /// <param name="instance">多对多关系实例</param> public void Apply(IManyToManyCollectionInstance instance) { //指定表名的生成规则,将表名按字符排序较小的一方表名在前方,表名较大的放到后面 instance.Table(instance.EntityType.Name.ToString()+instance.ChildType.Name.ToString()); //关联列的一方的命名方式 instance.Key.Column(instance.EntityType.Name.ToString()+"ID"); //关系列的另一方的命名方式 instance.Relationship.Column(instance.ChildType.Name.ToString()+"ID"); } }
public ISessionFactory CreateSessionFactory() { return Fluently .Configure() //创建或者指定数据库的配置xml,这里使用的是自动创建的方法 //指定数据库的映射方法,其实它的底层使用的是反射来实现的映射 .Database( MsSqlConfiguration .MsSql2005 .ConnectionString( "Data Source=.;Initial Catalog=Mapping;Integrated Security=true;Pooling=True;Min Pool Size=20;Max Pool Size=60") //指定连接字符串 .ShowSql() ) //配置映射规则 .Mappings(m => m.AutoMappings.Add(CreateAutomappings()) //将创建的AutoPersistenceModel对象添加到AutoMapping中 .ExportTo("c:\\path") //导出映射文件 ) //生成数据库架构 //new SchemaExport(cfg).Create(true, false)创建配置文件。 //这里的Create方法是创建的脚本文件的映射方法, //第一个参数bool script指定是否生成数据库脚本 //第二个参数bool export指定每次生成的数据库的创建脚本是否执行 .ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true)) .BuildSessionFactory(); }
[TestFixture] public class UnitTest1 : Build { [Test] public void TestUsers_UserDetails() { ISessionFactory sessionFactory = CreateSessionFactory(); ISession Session = sessionFactory.OpenSession(); //get user from database //User user1 = Session.Load<User>(2); //save the User data Session.Transaction.Begin(); //User usreUser = Session.Get<User>(2); User user = new User() { Name = "Jack", No = "12321" }; UserDetail userDetails = new UserDetail() { Age = 12, BirthDate = DateTime.Now.Date, Height = 240, Sex = 1 }; user.UserDetails = userDetails; userDetails.User = user; Session.Save(user); Session.Save(userDetails); Session.Transaction.Commit(); } }
[TestFixture] public class UnitTest1:Build { [Test] public void TestUsers_UserDetails() { ISessionFactory sessionFactory = CreateSessionFactory(); ISession Session=sessionFactory.OpenSession(); //get user from database //User user1 = Session.Load<User>(2); //save the User data Session.Transaction.Begin(); //User usreUser = Session.Get<User>(2); User user=new User() { Name = "Jack", No = "12321" }; UserDetail userDetails=new UserDetail() { Age = 12, BirthDate = DateTime.Now.Date, Height = 240, Sex = 1 }; user.UserDetails = userDetails; userDetails.User = user; Session.Save(user); Session.Save(userDetails); Session.Transaction.Commit(); } [Test] public void TestUsers_ProductProject() { ISessionFactory sessionFactory = CreateSessionFactory(); ISession Session = sessionFactory.OpenSession(); //get user from database //User user1 = Session.Load<User>(1); //save the User data Session.Transaction.Begin(); Project project = new Project() { Name = "project1" }; Product product1 = new Product() { Name = "Product1", Color = "Red", }; Product product2 = new Product() { Name = "Product2", Color = "Red" }; product1.Project.Add(project); product2.Project.Add(project); //Project project1 = new Project() //{ // Name = "project2" //}; project.Product.Add(product1); project.Product.Add(product2); Session.Save(project); Session.Save(product1); Session.Save(product2); Session.Transaction.Commit(); } [Test] public void TestUsers_ProjectProduct() { ISessionFactory sessionFactory = CreateSessionFactory(); ISession Session = sessionFactory.OpenSession(); //get user from database //User user1 = Session.Load<User>(1); //save the User data Session.Transaction.Begin(); Project project = new Project() { Name = "project1" }; Project project1 = new Project() { Name = "project2" }; Product product = new Product() { Name = "Product1", Color = "Red", }; product.Project.Add(project); product.Project.Add(project1); //project.Product.Add(product); //project1.Product.Add(product); Session.Save(project); Session.Save(project1); Session.Save(product); Session.Transaction.Commit(); } }
【架构之路之ORM】--FluentNHibernate之AutoMapping详解
标签:
原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/42248565