NHibernate3.3.3 学习笔记1

前言

    昨天在园友的介绍下,我找了一本学习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 }
Category实体类
 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 }
Product实体类

    备注:实体类中的字段属性都声明成 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 }
CategoryMap映射类
 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 }
ProductMap映射类

   备注:用于实现实体类与数据库表的映射

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、最后效果

结束语

   看英文原版很是吃力,如理解有误欢迎交流指正!!^-^

posted @ 2014-02-08 14:26  细品人生  阅读(408)  评论(0编辑  收藏  举报