• NHibernate初探(六) 一对多关系级联操作


    一对多关系通过外键关系连接两个表,而没有中间的表。

    首先先引用一段对集合的释义:

     

    Bag:对象集合,每个元素可以重复。例如{1,2,2,6,0,0},在.Net中相当于IList或者IList<T>实现。

    Set:对象集合,每个元素必须唯一。例如{1,2,5,6},在.Net中相当于ISet或者ISet<T>实现,Iesi.Collections.dll程序集提供ISet集合。

    List:整数索引对象集合,每个元素可以重复。例如{{1,"YJingLee"},{2,"CnBlogs"},{3,"LiYongJing"}},在.Net中相当于ArraryList或者List<T>实现。

    Map:键值对集合。例如{{"YJingLee",5},{"CnBlogs",7},{"LiYongJing",6}},在.Net中相当于HashTable或者IDictionary<Tkey,TValue>实现。

     

    持久类:

    (一)Customer

    public class Customer

    {

    public virtual int Unid { get; set; }

    public virtual FllName Name { get; set; }

    public virtual DateTime CreateTime { get; set; }

    public virtual string Address { get; set; }

    public virtual int Version { get; set; }

     

    private IList<Call> _list = new List<Call>();

    public virtual IList<Call> Phones

    {

    get { return _list; }

    set { _list = value; }

    }

    }

     

    public class FllName

    {

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string Names

    {

           get

    {

    return (FirstName+"·"+LastName);

    }

    }

    }

    这个类我要用于component,和一对多关系应用,所以多了个FullName复合属性。

    (二)Call

    public class Call

    {

    public virtual int Unid { get; set; }

    public virtual string Phone { get; set; }

     

    public virtual Customer Customer { get; set; }

    }

    这个类就是onetomany中的many一方

    (三)Customer mapping

    <bag name="Phones" table="Calls" cascade="all" inverse="true">

          <key column="CustomerId"></key>

          <one-to-many class="Domain.Entities.Call,Domain"/>

    </bag>

    (四)Call mapping

       <many-to-one name="Customer" column="CustomerId"

    class="Domain.Entities.Customer,Domain" not-null="true"/>

     

    说明一下:

    ·对于数据库表之间的关联关系,nhibernate也是mapping过来了(自己理解),所以不必在数据库中为数据表人为的建立关系,如果那样的话,nhibernate中就不必建立一对多关系了(这个我还没有测试)。

    ·对于一对多关系中的两方:一的一方带一个集合属性,而这个集合是多的那一方的集合;而多的一方带有一个一方的类型的属性,可以这样描述:一个父亲带有一群孩子,而一个孩子心中(现实也是)也有一个父亲。而对于对象的nhb,数据库中的外键由对象来描述。

     

    其实在这里,关系已经建立起来了,要做的就是进行curd了。

    (一)查询

    [Test]

    public void TestGetOne()

    {

        Customer cc = hh.GetElementById(38); 

     

        foreach (Call call in cc.Phones)

        {

    Console.WriteLine(call.Phone);

        }

    }

    其中的GetElementById方法就是查询一个Customer持久数据而已,但因为关系的建立,使得它的Phones属性得以填充。查看它的sql语句为:

    SELECT customer0_.Unid as Unid0_0_, customer0_.Version as Version0_0_, customer0_.FirstName as FirstName0_0_, customer0_.LastName as LastName0_0_, customer0_.CreateTime as CreateTime0_0_, customer0_.Address as Address0_0_ FROM Customer customer0_ WHERE customer0_.Unid=@p0;@p0 = 38

    SELECT phones0_.CustomerId as CustomerId1_, phones0_.Unid as Unid1_, phones0_.Unid as Unid1_0_, phones0_.Phone as Phone1_0_, phones0_.CustomerId as CustomerId1_0_ FROM Calls phones0_ WHERE phones0_.CustomerId=@p0;@p0 = 38

    分别查询两个表中的数据

    (二)添加

    public void TestAdd()

    {

        Customer c = new Customer

        {

    Name = new FllName { FirstName = "", LastName = "" },

    Address = "清河县1"

        };

     

        Call phones = new Call { Phone = "7777778" };

        Call phones1 = new Call { Phone = "9999978" };

        phones.Customer = c;

        phones1.Customer = c;

        try

        {

    c.Phones.Add(phones);

    c.Phones.Add(phones1);

        }

        catch

        { }

     

        hh.AddUpdateDelete(Domain.Enums.eOperation.Add, c);

    }

    这里的CustomerPhones是一个Call的集合。

    (三)删除

    public void TestDelete()

    {

        Customer c = new Customer {Unid=38};

        hh.AddUpdateDelete(Domain.Enums.eOperation.Delete, c);

    }

    直接删除就行了。

    (四)更新

    public void TestUpdate()

    {

        Customer c;

        c = hh.GetElementById(40);

        c.Phones[0].Phone = "55555555";

       

        hh.AddUpdateDelete(Domain.Enums.eOperation.Update, c);

    }

  • 相关阅读:
    Android Studio在项目中添加assets资源目录
    Android Studio向项目中导入jar包的方法
    Android Studio 配置 androidAnnotations框架详细步骤
    Android退出所有Activity最优雅的方式
    Android数据存储之SQLite使用
    Android数据存储之SharedPreferences使用
    三种实现Android主界面Tab的方式
    Android热门网络框架Volley详解
    Android必学之数据适配器BaseAdapter
    23种设计模式UML图
  • 原文地址:https://www.cnblogs.com/jams742003/p/1640149.html
Copyright © 2020-2023  润新知