• NHibernate初学五之关联一对多关系


    1:创建两张表T_Country、T_Person;其中T_Person表中有一个CountryID对应T_Country的ID,一个Country可以对应多个Person

    CREATE TABLE [dbo].[T_Country](
        [CountryID] [int] IDENTITY(1,1) NOT NULL,
        [CountryName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
     CONSTRAINT [PK_T_Country] PRIMARY KEY CLUSTERED 
    (
        [CountryID] ASC
    )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    
    
    CREATE TABLE [dbo].[T_Person](
        [PersonID] [int] IDENTITY(1,1) NOT NULL,
        [PersonName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [CountryID] [int] NULL,
     CONSTRAINT [PK_T_Person] PRIMARY KEY CLUSTERED 
    (
        [PersonID] ASC
    )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]

    2:实体代码如下,其中CountryModel类中有个IList<PersonModel>,PersonModel对应数据中CountryID对CountryModel,就没在属性中显示:

        public class CountryModel
        {
            public virtual int Countryid { get; set; }
            public virtual string Countryname { get; set; }
            public virtual IList<PersonModel> person { get; set; }
        }
    
        public class PersonModel
        {
            public virtual int Personid { get; set; }
            public virtual string Personname { get; set; }
            public virtual CountryModel counrtry { get; set; }
        }

    3:XML映射文件的内容,此处所延迟加载lazy都设为false,关于延迟加载后面的文章再写

    3.1 CountryModel.hbm.xml文件的内容:

    <?xml version="1.0" encoding="utf-8"?>
    <hibernate-mapping assembly="Wujy.ModelLibrary" namespace="Wujy.ModelLibrary.Entity" xmlns="urn:nhibernate-mapping-2.2">
      <class name="CountryModel" table="T_Country" lazy="false" >
        <id name="Countryid" column="CountryID">
          <generator class="identity" />
        </id>
        <property name="Countryname">
          <column name="CountryName" sql-type="nvarchar" not-null="false" />
        </property>
        <bag name="person" table="T_Person" generic="true" inverse="true" lazy="false">
          <key column="Countryid"></key>
          <one-to-many class="PersonModel"></one-to-many>
        </bag>
      </class>
    </hibernate-mapping>

    3.2 PersonModel.hbm.xml文件的内容:

    <?xml version="1.0" encoding="utf-8"?>
    <hibernate-mapping assembly="Wujy.ModelLibrary" namespace="Wujy.ModelLibrary.Entity" xmlns="urn:nhibernate-mapping-2.2">
      <class name="PersonModel" table="T_Person" lazy="false" >
        <id name="Personid" column="PersonID">
          <generator class="identity" />
        </id>
        <property name="Personname">
          <column name="PersonName" sql-type="nvarchar" not-null="false" />
        </property>
        <many-to-one name="counrtry" column="Countryid" class="CountryModel"></many-to-one>
      </class>
    </hibernate-mapping>

    4: 主要代码如下,其它代码可以直接从源代码进行下载:

    protected void Button1_Click(object sender, EventArgs e)
            {
                CountryModel model = new CountryModel();
                model.Countryname = "中国";
    
                CountryBll.Add(model);
    
                Response.Write("成功");
            }
    
            protected void Button5_Click(object sender, EventArgs e)
            {
                CountryModel countModel = new CountryModel();
                countModel.Countryname = "韩国";
                CountryBll.Add(countModel);
                IList<PersonModel> list = new List<PersonModel>();
                for (int i = 0; i < 3; i++)
                {
                    PersonModel model = new PersonModel();
                    model.Personname = "代号" + i.ToString();
                    model.counrtry = countModel;
                    list.Add(model);
                    PersonBll.Add(model);
                }
                Response.Write("成功");
            }
    
            protected void Button6_Click(object sender, EventArgs e)
            {
                CountryModel model = CountryBll.findById(1);
                PersonModel pmodel = new PersonModel();
                pmodel.counrtry = model;
                pmodel.Personname = "踏浪帅";
                PersonBll.Add(pmodel);
                Response.Write("成功");
            }
    
            protected void Button2_Click(object sender, EventArgs e)
            {
                IList<PersonModel> list = PersonBll.findAll();
                Response.Write("---------------------------------<br/>");
                foreach (PersonModel item in list)
                {
                    Response.Write("用户名:" + item.Personname + "-国家;" + item.counrtry.Countryname + "</br>");
                }
                Response.Write("---------------------------------<br/>");
                IList<CountryModel> counList = CountryBll.findAll();
                foreach (CountryModel item in counList)
                {
                    Response.Write("-------------------" + item.Countryname + "-------------------</br>");
                    foreach (PersonModel person in item.person)
                    {
                        Response.Write(person.Personname + "<br/>");
                    }
                }
            }

    效果图:

    5:many-to-one的XML属性说明:

    <many-to-one
            name="PropertyName"                               
            column="column_name"                               
            class="ClassName"                                  
            cascade="all|none|save-update|delete"              
            fetch="join|select"                                
            update="true|false"                                
            insert="true|false"                                
            property-ref="PropertyNameFromAssociatedClass"     
            access="field|property|nosetter|ClassName"         
            unique="true|false"                                
            optimistic-lock="true|false"                       
            not-found="ignore|exception"                       
    />
    
    

    (1) name:属性名。
    (2) column数据库字段名
    (3) class(可选 - 默认是通过反射得到属性类型): 关联的类的名字。
    (4) cascade(级联) (可选): 指明哪些操作会从父对象级联到关联的对象。
    (5) fetch (可选 - 默认为 select): 在外连接抓取(outer-join fetching)和序列选择抓取(sequential select fetching)两者中选择其一。
    (6) (可选 - defaults to true) 指定对应的字段是否包含在用于UPDATE 和/或 INSERT 的SQL语句中。如果二者都是false,则这是一个纯粹的
    “外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他属性得到 或者通过trigger(触发器)、或其他程序。
    (7) property-ref: (可选) 指定关联类的一个属性,这个属性将会和本外键相对应。 如果没有指定,会使用对方关联类的主键。
    (8) access(可选 - 默认是 property): NHibernate用来访问属性的策略。
    (9) unique (可选): 使用DDL为外键字段生成一个唯一约束。此外, 这也可以用作property-ref的目标属性。这使关联同时具有 一对一的效果。
    (10) optimistic-lock (可选 - 默认为 true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性
    发生脏数据时版本(version)的值是否增长。
    (11) not-found (可选 - 默认为 exception): 指定外键引用的数据不存在时如何处理: ignore会将数据不存在作为关联到一个空对象(null)处理。

    感谢您的阅读,坚持每天进步一点点,离成功就更新一步;希望文章对您有所帮助;源代码下载

  • 相关阅读:
    洛谷 P1464 Function(简单记忆化)
    LightOJ 1422 Halloween Costumes (区间DP)
    POJ 3280 Cheapest Palindrome(区间DP)
    POJ 2955 Brackets(区间DP)
    洛谷 P1880 [NOI1995]石子合并(区间DP)
    POJ 3641 Pseudoprime numbers(快速幂)
    POJ 2142 The Balance(exgcd)
    POJ 1995 Raising Modulo Numbers(快速幂)
    POJ 2115 C Looooops(exgcd)
    ZOJ 1002 Fire Net(dfs)
  • 原文地址:https://www.cnblogs.com/wujy/p/3602249.html
Copyright © 2020-2023  润新知