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

结束语

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

你可能感兴趣的:(hibernate3)