惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
G
Google Developers Blog
J
Java Code Geeks
爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
人人都是产品经理
人人都是产品经理
Martin Fowler
Martin Fowler
IT之家
IT之家
博客园_首页
B
Blog RSS Feed
Google DeepMind News
Google DeepMind News
B
Blog
U
Unit 42
Apple Machine Learning Research
Apple Machine Learning Research
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
N
Netflix TechBlog - Medium
T
Tailwind CSS Blog
博客园 - 聂微东
腾讯CDC
A
About on SuperTechFans

博客园 - EA_Games

ASP.NET常用代码 - EA_Games - 博客园 Oracle中的OMS的代理服务启动不了的问题 .Net术语大全 DataGrid中的数据导入到Word和Excel_C# NHibernate 进阶 用Nhibernate怎么实现数据的添加、删除、修改简单程序 每个开发人员现在应该下载的十种必备工具 nhibernate入门系列: one-to-one映射 nhibernate入门系列: one-to-many映射 NHibernate快速指南 ASP.NET 安全认证(三) -- 一点补充(或者叫优化) ASP.NET 安全认证(一) ASP.NET 安全认证(二) Winform如何存入、读取SQL SERVER数据库图片 无法运行ASP.NET Web应用程序 选择VB.Net还是C# ASP.NET中在线用户统计 在asp.net中访问sql server - EA_Games - 博客园 ASP.NET数据库中图片存储及读取
nhibernate入门系列: 对象持久化操作
EA_Games · 2005-11-22 · via 博客园 - EA_Games

                                                       nhibernate入门系列: 对象持久化操作

                                                       [ 2005-04-27 15:35:43 | 作者: NeoWing ]

nh通过类映射文件将数据表与类关联起来. 由类对应表, 属性对应列. 这样我们才能把对象转为表记录, 把表记录转为对象.
这里以一个Products表为例, 来说明类映射文件的一些细节.

先来看看Product对象(在基于OO的设计概念中,是先设计对象的哦~), 这个类比较简单, 只有一些属性.

class Product() {
product Product() {
}

#region O/R Mapping Fields.

private int productId; // 产品Id
public int ProductId
{
get { return productId; }
set { productId = value; }
}

private string name; // 名称
public string Name
{
get { return name; }
set { name = value; }
}

private string spec; // 规格
public string Spec
{
get { return spec; }
set { spec = value; }
}

private decimal unitPrice; // 单价
public decimal UnitPrice
{
get { return unitPrice; }
set { unitPrice = value; }
}

private DateTime updated; // 更新时间
public DateTime Updated
{
get { return updated; }
set { updated = value; }
}

#endregion
}

相应的Products表定义如下:

product_id int32 not null primary_key identity(1,1),
name varchar(50) not null,
spec varchar(100),
unit_price money,
updated datetime

现在可以建立Product的映射文件了.

<class name="Product, AssemblyName", table="Products">
// 指定类名为Product, 数据表为Products.

<id name="ProductId", column="product_id", type="Int32" unsaved="0">
<generator class="identity"/>
</id>
// 指定一个id, 在数据表中就是主键, 这个非常重要, nh就是通过id来判断对象的唯一性的.
// 在这里id名称是类的一个属性, 为ProductId, 对应的列是product_id.
// unsaved指定对象为持久化时的值, 如果id的值与之相等, 那nh就认为这个对象是从为持久化过的.
// generator指定一个id的产生器, 这里使用的是identity, 也即由数据库产生, 如果要自己产生, 那应使用assigned.

<property name="Name" column="name" type="String"/>
<property name="Spec" column="spec" type="String(100)"/>
<property name="UnitPrice" column="unit_price" type="Decimal"/>
<property name="Updated" column="updated" type="DateTime"/>
// property用于将属性和列名一一关联起来. name指定属性名; column指定类名;
// type指定类型, 如果省略type, nh就通过属生的类型来决定, 建议还是明确指定为好.
// 注意: 这里指定的类型是nh中定义的类型, 而不是.net内置的类型!
</class>

持久化操作

// 先建立一个Product对象.
Product p = new Product();
p.Name = "test";
p.Spec = "test spec";
p.UnitPrice = 10.5;
p.Updated = DateTime.Now;

Configuration cfg = new Configuartion();
cfg.AddXmlFile( "product.hbm.xml" ); // 加入映射文件.

// 创建会话工厂, 一般来说应该使用一个单例对象来封装会话工厂.
ISessionFactory sf = cfg.BuildSessionFactory();

// 打开一个会话.
ISession s = sf.OpenSession();

// 保存Product对象到数据库.
s.Save( p );

// 通过已知id载入Product对象
Product p2 = s.Load( typeof(Product), p.ProductId );
p2.Name = "update";
p2.Spec = "update spec";

// 更新Product对象.
s.Update( p2 );

// 删除Product对象
s.Delete( p2 );