表如下:
CREATE TABLE [dbo].[Category](
[Id] [int] IDENTITY(1,1) NOT NULL primary key,
[CategoryName] [varchar](254) COLLATE Chinese_PRC_CI_AS NOT NULL,
[ParentId] [int] NULL)
ALTER TABLE [dbo].[Category] WITH CHECK ADD CONSTRAINT [fk_category] FOREIGN KEY([ParentId])
REFERENCES [dbo].[Category] ([Id])
说明:category是一个无限分类表,其外键parentid引用自己的主键。
应用场合:产品分类,公司组织树等所有需要树数据结构的地方。在没有应用Nhibernate之前,想必需要大费一番周折把。
有了NHibernate,一切简单多了。
xml映射代码:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NHibernateSample.Domain"
namespace="NHibernateSample.Domain.Entities" >
<class name="Category" table="Category">
<id name="Id" type="Int32">
<generator class="native"></generator>
</id>
<many-to-one column="ParentId" class="Category" name="ParentCategory" cascade="save-update" ></many-to-one>
<property name="CategoryName" type="String" not-null="true"></property>
<set name="ChildCategories" cascade="save-update" inverse="true">
<key column="ParentId"></key>
<one-to-many class="Category"/>
</set>
</class>
</hibernate-mapping>
实体类:
public class Category
{
public virtual int? Id {private set; get; }
public virtual string CategoryName { set; get; }
private ISet<Category> childCategories = new HashedSet<Category>();
public virtual ISet<Category> ChildCategories
{
get { return childCategories; }
set { childCategories = value; }
}
public virtual Category ParentCategory { set; get; }
}
访问代码:
Category c1 = new Category();
c1.CategoryName = "学校1";
Category c2 = new Category();
c2.CategoryName = "学校2";
Category c3 = new Category();
c3.CategoryName = "院系1";
Category c4 = new Category();
c4.CategoryName = "院系2";
c1.ChildCategories.Add(c3);
c3.ParentCategory = c1;
c2.ChildCategories.Add(c4);
c4.ParentCategory = c2;
session.Save(c1);
session.Save(c2);