坚持,坚定,坚强

博客园 首页 新随笔 联系 订阅 管理

今天我们来看一下一对多的关系,在我们的数据库中不能很好的表达出一对多的关系,一个角色对多个可访问的Menu,但中间还有一个RoleToMenu的表,所以今天我们用其它表来说明

1. 新建一张订单表与顾客表, 一位顾客可以下许多的订单

结构如下

 

 

2. 创建两表的实体类

Customer.cs

 

 public class Customer
    {
        
public virtual int Id{get;set;}
        
public virtual int Ver{get;set;}
        
public virtual Name UserName { getset; }
       
// public virtual string FristName{get;set;}
       
// public virtual string LastName { get; set; }

        
public virtual IList<Order> MyOrder { getset; }
    }

 

因为一个顾客可以有多个订单,所以我们属性就添加一个订单的集合 MyOrder

 配置Customer.hbm.xml文件,其它属性按我们也前的设置,并对MyOrder进行配置

 

 <bag name="MyOrder" table="`Order`" generic="true" inverse="true">
      
<key column="CustomerId" foreign-key="FK_Order_Customer"/>
      
<one-to-many class="MyNHibernate.Models.Order,MyNHibernate.Models"/>
    
</bag>

首先两张表的关系为一对多,所以就有一个节点为 one-to-many ,类似于one-to-one。关键点在于 bag标签,这是告诉nhibernate我这要值出来的是集合

在这里不只是有bag 标签,还有set 等,每一个意思都不一样 bag 返回的值是 IList<Object>类型,所以在实体类里面是定义的IList<Order>。如果你想要用set标签的话那你要定义为 Iset<Order>了。

其它映射关系如下:

Mapping Node Interface
 <set>  Iesi.Collections.ISet
 <bag>  IList
 <list>  IList
 <map>  IDictionary

详细可查看:http://www.cnblogs.com/eric3298/archive/2010/11/23/1885310.html

3. Order.cs

 

public class Order
    {
      
public virtual int  OrderId{get;set;}
        
public virtual int Version{get;set;}
       
public virtual DateTime OrderDate {get;set;}
        
public virtual Customer Custom{get;set;}
    }

配置文件 Order.hbm.xml

 

 <many-to-one name="Custom" column="CustomerId" not-null="true" class="MyNHibernate.Models.Customer,MyNHibernate.Models" foreign-key="FK_Order_Customer" />

 

这里要跟Customer.cs 互相映射一下

 

4. 访问操作

取数据操作

 public static IList<Customer> SelectAll()
        {
            //return session.CreateCriteria(typeof(Customer)).CreateCriteria("MyOrder").SetResultTransformer(new NHibernate.Transform.DistinctRootEntityResultTransformer()).List<Customer>();
            return session.CreateSQLQuery("select distinct {customer.*},o.* from Customer {customer}"
                
+ " inner join [Order] o on o.CustomerId={customer}.CustomerId ")
 .AddEntity(
"customer"typeof(Customer))
 .List
<Customer>();
        }

 

一对多的关系就是这样子的。 明天我们来个多对多的


posted on 2011-06-13 09:31  老公鸡  阅读(416)  评论(0)    收藏  举报