Fluent Nhibernate code frist简单配置

Fluent Nhibernate code frist简单配置

 

前言

在以前的项目开发过程中使用nhibernate做完orm映射工具需要编写大量的xml映射文件,项目过程中往往会因为一个字段等小小的映射错误而很难去发现问题所在而且非常繁琐,后来我们的项目中采取了第三方的映射插件Nhibernate.Mapping.Attribute直接在实体类上标记生成映射文件,最近的新项目中打算使用fluent nhibernate,这个工具中提供了一个方法让你不再需要去写NHibernate的标准映射文件(.hbm.xml),而是可以把映射文件都使用C#来写。这样做,方便了我们的代码重构,提供了代码的易读性,并精简了项目代码,今天抽空简单学习一下,下面我们通过手动编写实体类,映射,来生成数据库。

实现

1、首先我们通过nuget包管理器添加fluent nhibernate的引用,安装成功后会自动添加对nhibernate的引用。

2、编写实体类,注意实体的属性都是virtual

编写Employee实体:

复制代码
namespace FluentNH.Model
{
    public class Employee
    {
        public virtual int Id { get; set; }
        public virtual string FirstName { get; set; }
        public virtual string Position { get; set; }
        public virtual Department EmployeeDepartment{get;set;}
    }
    
}
复制代码

编写Department实体:

复制代码
namespace FluentNH.Model
{
    public class Department
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual string PhoneNumber { get; set; }
    }
}
复制代码

3、实体类编写完成以后我们用代码的方式实现对两个实体的映射

Department映射:

复制代码
namespace FluentNH.Mapping
{
    class DepartmentMap : ClassMap<Department>
    {
        public DepartmentMap()
        {
            Id(x => x.Id);

            Map(x => x.Name);

            Map(x => x.PhoneNumber);

            Table("Department");
        }
    }
}
复制代码

EmployeeMap映射:

复制代码
class EmployeeMap : ClassMap<Employee>
    {
        public EmployeeMap()
        {
            Id(x => x.Id);

            Map(x => x.FirstName);

            Map(x => x.Position);

            References(x => x.EmployeeDepartment).Column("DepartmentId");

            Table("Employee");
        }
    }
复制代码

实体类及映射代码完成以后,若有任何一点改动我们需要在此修改。在映射文件构造函数里面的方法Map映射某一属性到表里面的列,References多对一的关系并制定生成列的名称,Tabel是指生成的表的名称。

4、编写辅助类配置Fluent nhiberate生成数据库及表结构

复制代码
public class NHibernateHelper
    {
        private static ISessionFactory _sessionFactory;

        private static ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)

                    InitializeSessionFactory();
                return _sessionFactory;
            }
        }

        private static void InitializeSessionFactory()
        {
            _sessionFactory = Fluently.Configure()
                //配置数据库
                .Database(MsSqlConfiguration.MsSql2008
                //指定连接字符串,也可写在配置文件中
                  .ConnectionString(
                  @"Server=(local);initial catalog=nhibernate;
        user=sa;password=123456;") 
                              .ShowSql()//显示sql语句
                )
                //指定需要映射的程序集
                .Mappings(m =>
                          m.FluentMappings
                              .AddFromAssemblyOf<Program>())
                .ExposeConfiguration(
                                //配置生成数据库及表结构
                                cfg => new SchemaExport(cfg).Create(true, true))
                                //创建session工厂
                .BuildSessionFactory();
        }

        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }
    }
复制代码

具体配置可参考fluent nhibernate的api,也可参考文中代码注释。

5、在控制台程序中测试以上配置

复制代码
class Program
    {
        static void Main(string[] args)
        {
            using (var session = NHibernateHelper.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var DepartmentObject = new Department { Name = "狼性法则", PhoneNumber = "18254241255" };
                    session.Save(DepartmentObject);
                    transaction.Commit();
                    Console.WriteLine("Department保存成功" + DepartmentObject.Name);

                    Console.ReadKey();
                }
            }
        }
    }
复制代码

运行程序,打开数据库查询生成的表结构,并可以在控制台中查看sql语句,如图。

 

可以看到生成的数据库及语句,但我们可以发现存在一些问题如,数据库中列的长度等,这些也是可以在映射文件配置中设定的,本文由于是对fluent nhibernate的初始也没考虑太多,基本使用实例就此完成。

 
 
 
标签: NHIBERNATE
原文地址:https://www.cnblogs.com/Leo_wl/p/3267964.html