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

Fluent Nhibernate code frist简单配置的更多相关文章

  1. 【翻译】Fluent NHibernate介绍和入门指南

    英文原文地址:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started 翻译原文地址:http://www.cnblogs ...

  2. Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发

    Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧, ...

  3. EntityFramework数据库配置(code frist)

    什么也不说先贴代码 <?xml version="1.0" encoding="utf-8"?> <configuration> < ...

  4. 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)

    在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...

  5. [Fluent NHibernate]第一个程序

    目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Fluent Nhibernate的东东,也激起我的兴 ...

  6. [Fluent NHibernate]一对多关系处理

    目录 写在前面 系列文章 一对多关系 总结 写在前面 上篇文章简单介绍了,Fluent Nhibernate使用代码的方式生成Nhibernate的配置文件,以及如何生成持久化类的映射文件.通过上篇的 ...

  7. Code First03---CodeFirst根据配置同步到数据库的三种方式

    上一节我们说到使用Fluent API对实体的配置,但是有一个问题了,在业务中我们可以用到的实体很多,那是不是每个都需要这样去配置,这样就造成我们重写的OnModelCreating方法很庞大了.所以 ...

  8. Entity Framework 6.x Code Frist For Oracle 实践与注意点

    Entity Framework 6.x Code Frist For Oracle 实践与注意点 开发环境 Visual Studio.net 2015/2017 Oracle 11g/12c 数据 ...

  9. Fluent NHibernate and Mysql,SQLite,PostgreSQL

    http://codeofrob.com/entries/sqlite-csharp-and-nhibernate.html https://code.google.com/archive/p/csh ...

随机推荐

  1. Tair LDB基于Prefixkey找到如何提取一系列性能优化项目key的prefix_size

    眼下项目已快截止,编码任务也基本完毕.如今主要是性能測试. 项目是依照"Tair LDB基于Prefixkey的范围查找性能优化项目提议方案"的步骤一步步完毕的,首先先介绍第一个关 ...

  2. Oracle推断领域包括中国

    假设你要推断领域包括中国.有一个简单的方法. SQL> drop table test purge; SQL> create table test as select * from dba ...

  3. vs2005中的WebBrowser控件的简单应用

    原文:vs2005中的WebBrowser控件的简单应用 这个控件被封装了一下,和以前的调用方式稍有不同.事件还是那几个,变化不大.方法变了不少.从网上能查到的资料不多,贴出一些代码来作参考.看看这段 ...

  4. IOS开发中绘制地图线路

    地图应用经常会涉及到线路的绘制问题,ios下可以使用MKMapView进行地图开发,使用 MKOverlayView进行线路的绘制. 使用MKMapView添加MKMap.framework 和Cor ...

  5. 关于UtilTimerStack类的使用--XWork2、Struts2内置性能诊断类

    关于UtilTimerStack类的使用--XWork2.Struts2内置性能诊断类 一.UtilTimerStack做什么用的? 这个本来是Xwork2(Struts2的核心)的相关的工具类,可以 ...

  6. 安德鲁斯Selector简介

    <? xml version="1.0" encoding="utf-8"? > <selector xmlns:android=" ...

  7. How to:Installshield判断操作系统是否为64位,并且为操作注册表进行设置

    原文:How to:Installshield判断操作系统是否为64位,并且为操作注册表进行设置 IS脚本操作注册表在64位平台下必须有特殊的设置 if (SYSINFO.bIsWow64) then ...

  8. Android使用OpenGL ES2.0显示YUV,您的手机上的数据要解决两个方面的坐标

    如果说 ,我不知道,如果你不明白这个话题.连接到:http://blog.csdn.net/wangchenggggdn/article/details/8896453(下称链接①), 里面评论有非常 ...

  9. UpdateModel方法

    WebForm 对 MVC 说:能否借你的UpdateModel方法来用用? 背景 ASP.NET MVC的Controller有个很不错的方法:UpdataModel (相对应的还有TryUpdat ...

  10. 织梦不仅是链接到其他调用next

    //打开系统文件织梦 /include/arc.archives.class.php 找到GetPreNext函数 function GetPreNext($gtype='') { $rs = ''; ...