龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > asp.net编程 >

NHibernate2.1实例使用教程之entity-name特性介绍(2)

时间:2009-12-21 11:47来源:未知 作者:admin 点击:
分享到:
3.Test 先保存一些Domain,注意这里用到了重载session.Save(实体名称, 实例)方法。 Code [http://www.xueit.com] using (var s = Sessions.OpenSession()) using (var tx = s.BeginTransact

3.Test

先保存一些Domain,注意这里用到了重载session.Save(实体名称, 实例)方法。

Code [http://www.xueit.com]
using (var s = Sessions.OpenSession())
using (var tx = s.BeginTransaction())
{
    var rf = new Reptile { Description = "" };
    var rm = new Reptile { Description = "" };
    var rc1 = new Reptile { Description = "子1" };
    var rc2 = new Reptile { Description = "子2" };
    var rfamily = new Family<Reptile>
    {
        Father = rf,
        Mother = rm,
        Childs = new HashedSet<Reptile> { rc1, rc2 }
    };
    var hf = new Human { Description = "父亲", Name = "Father" };
    var hm = new Human { Description = "母亲", Name = "Mother" };
    var hc1 = new Human { Description = "孩子", Name = "Child" };
    var hfamily = new Family<Human>
    {
        Father = hf,
        Mother = hm,
        Childs = new HashedSet<Human> { hc1 }
    };
    //重载session.Save(实体名称, 实例)方法
    s.Save("ReptilesFamily", rfamily);
    s.Save("HumanFamily", hfamily);
    tx.Commit();
}

运行结果:

NHibernate entity-name

查询:

Code [http://www.xueit.com]
using (var s = Sessions.OpenSession())
using (var tx = s.BeginTransaction())
{
    IList<Family<Human>> hf = s.CreateQuery("from HumanFamily").List<Family<Human>>();
    Assert.That(hf.Count, Is.EqualTo(1));
    Assert.That(hf[0].Father.Name, Is.EqualTo("Father"));
    Assert.That(hf[0].Mother.Name, Is.EqualTo("Mother"));
    Assert.That(hf[0].Childs.Count, Is.EqualTo(1));

    IList<Family<Reptile>> rf = s.CreateQuery("from ReptilesFamily").List<Family<Reptile>>();
    Assert.That(rf.Count, Is.EqualTo(1));
    Assert.That(rf[0].Childs.Count, Is.EqualTo(2));

    tx.Commit();
}

运行结果:

代码

Source Project Home:http://code.google.com/p/yjinglee/

SVN CheckOut:http://yjinglee.googlecode.com/svn/trunk/

结语

上面的映射还是有点复杂,可以想想更有趣的是只持久化Family<T>类。因为我创建一张表(家族表)而我需要一些具体的类型Family<Reptile>和Family<Human>。在这种情况下我不能说Family<Reptile>是子类(在我的Domain中,没有Family<T>的父类 )。可以使用<discriminator>、discriminator-value和where标签,大家可以先想想映射怎么改写呢。


精彩图集

赞助商链接