标签:
上篇文章详细讨论了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)IHasManyToManyConventionpublic 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