zoukankan      html  css  js  c++  java
  • NHibernate初学者指南(9):会话管理(附实例)

    进行.NET开发,你可能已经接触到下面的一种或几种类型的应用程序:

    1. 基于Web的应用程序,包括Silverlight。
    2. WinForm或WPF应用程序
    3. Windows服务。

    当然,还有很多其他类型的应用程序,但是它们使用NHibernate会话管理的方法和上面三种类型的程序相同。

    本篇文章,我们创建一个简单的Silverlight应用程序实现基本的会话管理。Silverlight是基于Web的应用程序,所以这里用到的技术也同样适用于其他类型的web程序(ASP.NET MVC或WebForms)。

    1. 在SSMS中新建一个数据库:SilverlightSample。

    2. 打开VS,创建一个Silverlight的项目:SilverlightSample,如下图:

     创建Silverlight项目

    3. 当询问是否将Silverlight程序寄宿在网站时,保持默认设置即可,单击OK继续。

    寄宿在网站中

    4. 在SilverlightSample.Web项目中,添加对NHibernate,NHibernate.ByteCode.Castle和Fluent NHibernate三个程序集的引用。

    5. 在SilverlightSample.Web项目中添加一个Product.cs类文件,在里面定义一个简单的Product实体,如下面的代码所示:

    public class Product
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
    }

    6. 在SilverlightSample.Web项目中添加一个ProductMap.cs类文件,定义Product实体的映射,如下面的代码所示:

    public class ProductMap : ClassMap<Product>
    {
        public ProductMap()
        {
            Id(x => x.Id).GeneratedBy.HiLo("1000");
            Map(x => x.Name);
        }
    }

    7. 在SilverlightSample.Web项目中添加一个SessionProvider类。这个类有一个SessionProvider类型的静态属性:Instance。如下面的代码所示:

    public class SessionProvider
    {
        public static SessionProvider Instance { get; set; }
    }

    8. 在这个类中添加一个ISessionFactory类型的静态实例变量,如下面的代码所示:

    private static ISessionFactory sessionFactory;

    9. 在类中添加一个静态的构造函数,初始化Instance属性,如下所示:

    static SessionProvider()
    {
        var provider = new SessionProvider();
        provider.Initialize();
        Instance = provider;
    }

    10. 在类中添加一个空private构造函数,不初始化,如下所示:

    private SessionProvider()
    {
    }

    11. 在类中添加一个Initialize方法,它包含配置NHibernate,创建数据库架构和创建session工厂的代码:

    private void Initialize()
    {
        const string connString =
                "server=.;database=SilverlightSample;" +
                "user id=sa;password=sasa;";
        var configuration = Fluently.Configure()
                            .Database(MsSqlConfiguration.MsSql2008
                            .ConnectionString(connString)
                            .ShowSql())
                            .Mappings(m => m.FluentMappings
                            .AddFromAssemblyOf<Product>())
                            .BuildConfiguration();
        var exporter = new SchemaExport(configuration);
        exporter.Execute(true, true, false);
        sessionFactory = configuration.BuildSessionFactory();
    }

    12. 再添加一个OpenSession方法,它返回ISession。

    public ISession OpenSession()
    {
        return sessionFactory.OpenSession();
    }

    13. 添加一个Silverlight-enabled WCF Service到SilverlightSample项目,名字为:ProductService,如下图:

    创建ProductService

    14. 删除类中默认的方法,添加一个CreateProduct方法,代码如下所示:

    public class ProductService
    {
        [OperationContract]
        public int CreateProduct()
        {
            using (var session = SessionProvider.Instance.OpenSession())
            using (var transaction = session.BeginTransaction())
            {
                var product = new Product { Name = "Apple" };
                var productId = (int)session.Save(product);
                transaction.Commit();
                return productId;
            }
        }
    }

    15. 编译解决方案,这一步对下一步很重要!

    16. 在Solution Explorer窗口中,右击SilverlightSample项目,选择Add Service Reference..

    17. 在Add Service Reference对话框中,单击"Discover"按钮。Visual Studio会在本地发现ProductService.svc这个服务。

    添加服务

    18. 单击OK继续。Visual Studio会创建web service的一个代理,可以被客户端使用,如下图:

    19. 在SilverlightSample项目中的MainPage.xaml中添加一个按钮,代码如下:

        <Grid x:Name="LayoutRoot" Background="White">
            <Button x:Name="CreateProduct" Content="Create Product"
    Click="OnCreateProduct" Width="100" Height="30"/>
        </Grid>

    20. 为前面代码的单击事件处理程序添加代码,使用ProductService代理在数据库中创建一个product。如下面的代码所示:

    private void OnCreateProduct(object sender, RoutedEventArgs e)
    {
        var client = new ProductService.ProductServiceClient();
        client.CreateProductCompleted += OnProductCreated;
        client.CreateProductAsync();
    }
    private void OnProductCreated(object sender, CreateProductCompletedEventArgs e)
    {
        MessageBox.Show(string.Format(
        "Created product with id={0}", e.Result));
    }

    运行程序,单击CreateProduct按钮,程序弹出一个对话框,说明插入成功,如下图:

    运行结果

    到此,一个简单的程序就完成了。

  • 相关阅读:
    jQuery Event.delegateTarget 属性详解
    velocity 判断 变量 是否不是空或empty
    触碰jQuery:AJAX异步详解
    jQuery Select操作大集合
    常用元素默认margin和padding值问题探讨
    九大排序算法再总结
    八大排序算法
    JavaScript中toStirng()与Object.prototype.toString.call()方法浅谈
    使用CSS3的appearance属性改变元素的外观
    CSS清浮动处理(Clear与BFC)
  • 原文地址:https://www.cnblogs.com/nianming/p/2252655.html
Copyright © 2011-2022 走看看