nhibernate的关系

本文介绍使用Fluent NHibernate进行表间关系映射的方法,包括多对一(References)、一对多(HasMany)及一对一(HasOne)。通过具体示例展示了如何实现这些关系,并在同一个事务中自动生成主表和从表之间的关联。

用nhibernate,觉得比较难把握的是其中表间的关系。

我用的是Fluently Nhibernate,直接用代码,而不是XML来书写代码与数据表的映射。其中表间关系有3种:

1、References(多对一)
2、HasMany(一对多)
3、HasOne(一对一)

1、References(多对一)
用于从表映射主表。常与主表映射从表的HasMany一起使用,可在同一事务中,让主表的ID和从表关联主表的ID一起生成。

比如说,主表的ID是个自增的字段,或者应用序列号(sequence)的字段。然后从表有个相应的字段关联了主表的ID。很明显,要先获得这个主表ID的值,从表这个关联ID才能赋值。如果是分步骤、分开事务的话,好像太琐碎了点。现在可以这样:

/*实体类*/
public class Master
{//主表
    public virtual int ID{ get; set; }
    public virtual IList<Slave> Slaves { get; set; }
}
public class Slave
{//从表
    public virtual int ID { get; set; }
    public virtual int MasterID { get; set; }
    public virtual Master Master { get; set; }
}   

/*映射*/
public class MasterMap : ClassMap<Master>
{//主表
    public MasterMap()
    {
        Table("Master");
        Id(s => s.ID).GeneratedBy.Sequence("SEQ_Master");

        HasMany<Slave>(s => s.Slaves)
            .KeyColumn("MasterID") //指的是关联表的关联字段(自动用本表的主键字去关联对方)
            .Cascade.All()
            .LazyLoad();
    }
}
public class  SlaveMap : ClassMap<Slave>
{//从表
    public SlaveMap()
    {
        Table("Slave");
        Id(s => s.ID).GeneratedBy.Sequence("SEQ_Slave");
        Map(s => s.MasterID);
        References<Master>(s => s.Master).Not.LazyLoad().Column("MasterID");//本表的字段,关联主表的关键字
    }
}

/*数据库操作Insert*/
Master master = new Master();
IList<Slave> lisSlave = new List<Slave>()
{
    new Slave(){ Master = master},//你中有我
    new Slave(){ Master = master},
    new Slave(){ Master = master}
};
master.Slaves = lisSlave;//我中有你

masterService.Add(master);//插入到数据库

这样子之后,从表里的字段MasterID都已自动赋上了正确的值。不必先插入主表记录,获得其ID,然后再手动赋给从表对象这么麻烦。

PropertyRef
在关系References 和 HasMany里都有这个属性。注意是实体类里的属性名,而不是字段名。

property-ref:指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键(可选).property-ref属性只应该用来对付老旧的数据库系统,可能出现外键指向对方关联表的是个非主键字段(但是应该是一个惟一关键字)的情况。这是一种十分丑陋的关系模型。比如说,假设Product类有一个惟一的序列号,它并不是主键;

2、HasMany(一对多)
参考1

3、HasOne(一对一)
没啥心得

转载于:https://www.cnblogs.com/leftfist/p/6808680.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值