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的初始也没考虑太多,基本使用实例就此完成。
Fluent Nhibernate code frist简单配置的更多相关文章
- 【翻译】Fluent NHibernate介绍和入门指南
英文原文地址:https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started 翻译原文地址:http://www.cnblogs ...
- Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发
Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧, ...
- EntityFramework数据库配置(code frist)
什么也不说先贴代码 <?xml version="1.0" encoding="utf-8"?> <configuration> < ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- [Fluent NHibernate]第一个程序
目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Fluent Nhibernate的东东,也激起我的兴 ...
- [Fluent NHibernate]一对多关系处理
目录 写在前面 系列文章 一对多关系 总结 写在前面 上篇文章简单介绍了,Fluent Nhibernate使用代码的方式生成Nhibernate的配置文件,以及如何生成持久化类的映射文件.通过上篇的 ...
- Code First03---CodeFirst根据配置同步到数据库的三种方式
上一节我们说到使用Fluent API对实体的配置,但是有一个问题了,在业务中我们可以用到的实体很多,那是不是每个都需要这样去配置,这样就造成我们重写的OnModelCreating方法很庞大了.所以 ...
- Entity Framework 6.x Code Frist For Oracle 实践与注意点
Entity Framework 6.x Code Frist For Oracle 实践与注意点 开发环境 Visual Studio.net 2015/2017 Oracle 11g/12c 数据 ...
- Fluent NHibernate and Mysql,SQLite,PostgreSQL
http://codeofrob.com/entries/sqlite-csharp-and-nhibernate.html https://code.google.com/archive/p/csh ...
随机推荐
- krpano音量控制(我们已经转移到krpano中国网站 krpano360.com)
需求: 实现音量控制,这是官网的样例, 本文已经转移 到 krpano中文网 p=148">http://krpano360.com/? p=148 很多其它教程关注微信公众号 krp ...
- C# 打开指定文件或网址
System.Diagnostics.Process.Start的妙用: 文件夹打开时自动选中一个文件,比如自动选中此目录下的指定文件方法: Process.Start("Explorer& ...
- Java初认识--Java中的语法结构
Java中的语法结构(程序流程控制) Java的语法结构有四种: 1.顺序结构. 顺序结构很简单,就是按顺序执行,输出就可以了. 2.判断结构. 判断结构的一个代表性的语句是if:if语句有三种格式体 ...
- iOS开发的一些奇巧淫技2
能不能只用一个pan手势来代替UISwipegesture的各个方向? - (void)pan:(UIPanGestureRecognizer *)sender { typedef NS_ENUM(N ...
- 网站静态化处理—CSI(5)
网站静态化处理—CSI(5) 讲完了SSI,ESI,下面就要讲讲CSI了 ,CSI是浏览器端的动静整合方案,当我文章发表后有朋友就问我,CSI技术是不是就是通过ajax来加载数据啊,我当时的回答只是说 ...
- DEDECMS织梦常用二开自定义标签
网站名称:{dede:global.cfg_webname/} 网站根网址:{dede:global.cfg_basehost/} 网站根目录:{dede:global.cfg_cmsurl/} 网页 ...
- 工作流设计参考(包括PHP实现)
工作流很少有让人满意的,即便是国内用的比较多的jbpm,用起来也会觉得很便扭.再加上PHP中没有什么好用的工作流,于是干脆自己设计一个,设计的原则如下: 1 根据80/20原则,只使用wfmc模型中最 ...
- Phpstorm配置phpunit对php进行单元测试
在 phpstorm 中配置 php 项目的单元测试,项目使用 Composer 进行管理,为了避免在项目中直接引入 phpunit 相关代码包,使项目的 vendor 目录变得臃肿,这里采用全局安装 ...
- div、ul、li等无法居中问题,text-align无效 margin auto无效
很简单.如果是div,直接把div换成: <table align="center"> <tr> <td> ...
- .NET 开源了,Visual Studio 开始支持 Android 和 iOS 程序编写并自带 Android 模拟器
.NET 开源了,Visual Studio 开始支持 Android 和 iOS 程序编写并自带 Android 模拟器 北京时间今天凌晨的 Connect(); 大会上,多少程序员的假想成为现实. ...