您的位置:首页 > 其它

NHibernate初学者指南(9):会话管理(附实例)

2011-11-17 18:13 225 查看
进行.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,如下图:





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,如下图:





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按钮,程序弹出一个对话框,说明插入成功,如下图:





到此,一个简单的程序就完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: