昨天在园友的介绍下,我找了一本学习NHibernate的书:《NHibernate 3 Beginner’s Guide》。
第一章我直接跳过了,因为是英文版的看起来很吃力,且第一章就是介绍一些NHibernate的特性的,所以我直接PASS了。
本篇博文就是介绍我学习第二章自己所理解的知识。
下载NHibernate:http://nhforge.org/Default.aspx
下载FluentNHibernate:http://www.fluentnhibernate.org/
0、打开VS工具,创建一个WPF项目,添加NHibernate.dll 和FluentNHibernate.dll引用:
这个是一个简单的商品存储系统。
1、创建两个实体类:Category、Product
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ProductInventory 7 { 8 /// <summary> 9 /// 分类 10 /// </summary> 11 public class Category 12 { 13 public virtual Int32 Id { get; set; } 14 /// <summary> 15 /// 名称 16 /// </summary> 17 public virtual String Name { get; set; } 18 /// <summary> 19 /// 描述 20 /// </summary> 21 public virtual String Description { get; set; } 22 } 23 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ProductInventory 7 { 8 /// <summary> 9 /// 产品 10 /// </summary> 11 public class Product 12 { 13 public virtual Int32 Id { get; set; } 14 public virtual String Name { get; set; } 15 public virtual String Description { get; set; } 16 public virtual Category Category { get; set; } 17 public virtual Decimal UnitPrice { get; set; } 18 public virtual Int32 ReorderLevel { get; set; } 19 public virtual Boolean Discontinued { get; set; } 20 } 21 }
备注:实体类中的字段属性都声明成 virtual ,这个是NHibernate在运行的时候对实体类进行重写所必须的要求。
2、实体映射类:CategoryMap、ProductMap
添加命名空间:using FluentNHibernate.Mapping;
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 // 6 using FluentNHibernate.Mapping; 7 8 namespace ProductInventory 9 { 10 public class CategoryMap:ClassMap<Category> 11 { 12 public CategoryMap() 13 { 14 Id(x => x.Id); 15 Map(x => x.Name); 16 Map(x => x.Description); 17 } 18 } 19 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 // 6 using FluentNHibernate.Mapping; 7 8 namespace ProductInventory 9 { 10 public class ProductMap : ClassMap<Product> 11 { 12 public ProductMap() 13 { 14 Id(x => x.Id); 15 Map(x => x.Name); 16 Map(x => x.Description); 17 Map(x => x.UnitPrice); 18 Map(x => x.ReorderLevel); 19 Map(x => x.Discontinued); 20 References(x => x.Category); 21 } 22 } 23 }
备注:用于实现实体类与数据库表的映射
3、主界面
1 <Window x:Class="ProductInventory.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 Title="MainWindow" Height="350" Width="525"> 5 <Grid> 6 <Grid.ColumnDefinitions> 7 <ColumnDefinition Width="Auto"/> 8 <ColumnDefinition Width="*"/> 9 </Grid.ColumnDefinitions> 10 <Grid.RowDefinitions> 11 <RowDefinition Height="Auto" /> 12 <RowDefinition Height="Auto"/> 13 <RowDefinition Height="Auto"/> 14 <RowDefinition Height="42*"/> 15 <RowDefinition Height="42*"/> 16 <RowDefinition Height="54*"/> 17 <RowDefinition Height="52*"/> 18 <RowDefinition Height="21*"/> 19 <RowDefinition Height="43*"/> 20 </Grid.RowDefinitions> 21 <Button x:Name="btnCreateDatabase" Content="创建数据库" Height="50" Click="btnCreateDatabase_Click" Grid.ColumnSpan="2" /> 22 <Button x:Name="btnCreateSessionFactory" Content="创建会话工厂" Height="50" Click="btnCreateSessionFactory_Click" Grid.Row="1" Grid.ColumnSpan="2" /> 23 <Button x:Name="btnCreateSession" Content="创建会话" Height="50" Click="btnCreateSession_Click" Grid.Row="2" Grid.ColumnSpan="2" /> 24 <TextBlock Text="分类名称:" Grid.Row="3"/> 25 <TextBlock Text="分类描述:" Grid.Row="4"/> 26 <TextBox x:Name="txtCategoryName" Grid.Row="3" Grid.Column="1"/> 27 <TextBox x:Name="txtCategoryDescription" Grid.Row="4" Grid.Column="1"/> 28 <Button x:Name="btnAddCategory" Content="添加分类" Height="50" Grid.Row="5" Click="btnAddCategory_Click" /> 29 <Button x:Name="btnLoadCategories" Content="查看分类" Height="50" Grid.Row="6" Click="btnLoadCategories_Click"/> 30 <ListBox x:Name="lstCategories" Grid.Row="6" Grid.Column="1" Grid.RowSpan="2" /> 31 </Grid> 32 </Window>
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Windows; 6 using System.Windows.Controls; 7 using System.Windows.Data; 8 using System.Windows.Documents; 9 using System.Windows.Input; 10 using System.Windows.Media; 11 using System.Windows.Media.Imaging; 12 using System.Windows.Navigation; 13 using System.Windows.Shapes; 14 // 15 using FluentNHibernate.Cfg; 16 using FluentNHibernate.Cfg.Db; 17 using NHibernate; 18 using NHibernate.Cfg; 19 using NHibernate.Tool.hbm2ddl; 20 using NHibernate.Linq; 21 22 namespace ProductInventory 23 { 24 /// <summary> 25 /// MainWindow.xaml 的交互逻辑 26 /// </summary> 27 public partial class MainWindow : Window 28 { 29 public MainWindow() 30 { 31 InitializeComponent(); 32 } 33 /// <summary> 34 /// 数据库连接字符串 35 /// </summary> 36 const String connectionString = "server=(local);database=NHiberate3;Integrated Security=SSPI;"; 37 38 #region ======创建数据库表====== 39 private void btnCreateDatabase_Click(object sender, RoutedEventArgs e) 40 { 41 Fluently.Configure().Database(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString)) 42 .Mappings(m=>m.FluentMappings.AddFromAssemblyOf<ProductMap>()) 43 .ExposeConfiguration(CreateSchema) 44 .BuildConfiguration(); 45 } 46 47 private static void CreateSchema(Configuration cfg) 48 { 49 var schemaExport = new SchemaExport(cfg); 50 schemaExport.Drop(false, true); 51 schemaExport.Create(false, true); 52 } 53 #endregion ======创建数据库表====== 54 55 #region ======创建会话工厂====== 56 57 private void btnCreateSessionFactory_Click(object sender, RoutedEventArgs e) 58 { 59 var factory = CreateSessionFactory(); 60 } 61 62 private ISessionFactory CreateSessionFactory() 63 { 64 return Fluently.Configure().Database(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString)) 65 .Mappings(m => m.FluentMappings.AddFromAssemblyOf<ProductMap>()).BuildSessionFactory(); 66 } 67 68 #endregion ======创建会话工厂====== 69 70 #region ======创建会话====== 71 private void btnCreateSession_Click(object sender, RoutedEventArgs e) 72 { 73 var factory = CreateSessionFactory(); 74 using (var session = factory.OpenSession()) 75 { 76 77 } 78 } 79 #endregion ======创建会话====== 80 81 #region ======保存数据====== 82 private void btnAddCategory_Click(object sender, RoutedEventArgs e) 83 { 84 var factory = CreateSessionFactory(); 85 using (var session = factory.OpenSession()) 86 { 87 var category = new Category 88 { 89 Name = txtCategoryName.Text, 90 Description = txtCategoryDescription.Text 91 }; 92 session.Save(category); 93 } 94 } 95 #endregion ======保存数据====== 96 97 #region ======查看数据====== 98 private void btnLoadCategories_Click(object sender, RoutedEventArgs e) 99 { 100 var factory = CreateSessionFactory(); 101 using (var session = factory.OpenSession()) 102 { 103 var categories = session.Query<Category>() 104 .OrderBy(c => c.Name) 105 .ToList(); 106 lstCategories.ItemsSource = categories; 107 lstCategories.DisplayMemberPath = "Name"; 108 } 109 } 110 #endregion ======查看数据====== 111 } 112 }
备注:
1、Fluently.Configure().Database(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString)) .Mappings(m=>m.FluentMappings.AddFromAssemblyOf<ProductMap>()) .ExposeConfiguration(CreateSchema) .BuildConfiguration();中
Configure():读取配置
Database(MsSqlConfiguration.MsSql2008.ConnectionString(connectionString)):链接到微软2008版本数据库
Mappings(m=>m.FluentMappings.AddFromAssemblyOf<ProductMap>()):映射实体
ExposeConfiguration(CreateSchema):创建数据库表
BuildConfiguration():编译配置,也就是执行前面的所有配置
4、最后效果
看英文原版很是吃力,如理解有误欢迎交流指正!!^-^