• NHibernate初学四之关联一对一关系


    1:数据库脚本,创建两张表T_Area、T_Unit,表示一个单位对应一个地区,在单位表中有个AreaID为T_Area表中的ID;

    CREATE TABLE [dbo].[T_Area](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [AreaName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
     CONSTRAINT [PK_T_Area] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    
    
    CREATE TABLE [dbo].[T_Unit](
        [ID] [int] IDENTITY(1,1) NOT NULL,
        [UnitName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
        [AreaID] [int] NULL,
     CONSTRAINT [PK_T_Unit] PRIMARY KEY CLUSTERED 
    (
        [ID] ASC
    )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]

    2:实体代码如下:

    namespace Wujy.ModelLibrary.Entity
    {
        public class AreaModel
        {
            public virtual int Id { get; set; }
            public virtual string Areaname { get; set; }
            public virtual UnitModel unit { get; set; }
        }
    }
    
    
    namespace Wujy.ModelLibrary.Entity
    {
        public class UnitModel
        {
            public virtual int Id { get; set; }
            public virtual string Unitname { get; set; }
            public virtual int? Areaid { get; set; }
            public virtual AreaModel area { get; set; }
        }
    }

    3:XML映射文件的内容:

    3.1 AreaModel.hbm.xml文件内容

    <hibernate-mapping assembly="Wujy.ModelLibrary" namespace="Wujy.ModelLibrary.Entity" xmlns="urn:nhibernate-mapping-2.2">
      <class name="AreaModel" table="T_Area" lazy="true" >
        <id name="Id" column="ID">
          <generator class="identity" />
        </id>
        <property name="Areaname">
          <column name="AreaName" sql-type="nvarchar" not-null="false" />
        </property>
        <one-to-one name="unit" cascade="all"></one-to-one>
      </class>
    </hibernate-mapping>

    3.2 UnitModel.hbm.xml文件内容

    <hibernate-mapping assembly="Wujy.ModelLibrary" namespace="Wujy.ModelLibrary.Entity" xmlns="urn:nhibernate-mapping-2.2">
      <class name="UnitModel" table="T_Unit" lazy="true" >
        <id name="Id" column="ID">
          <generator class="identity" />
        </id>
        <property name="Unitname">
          <column name="UnitName" sql-type="nvarchar" not-null="false" />
        </property>
        <property name="Areaid">
          <column name="AreaID" sql-type="int" not-null="false" />
        </property>
        <one-to-one name="area" cascade="all"></one-to-one>
      </class>
    </hibernate-mapping>

    注意:Cascade:则表示一种级联操作,它的值有nonesave-updatedeleteallall-delete-ophan,它主要作用是在父类子类之间进行操作时,哪些操作会对父类(如班级Class类)、子类(Student)有影响。在NHibernate社区,Cascade默认值为none。

    4:主要代码如下,其它DAL层的代码可以见文章后面的源代码下载,其中Button3_Click中的代码里面有获得model.area.Areaname  areamodel.unit.Unitname;

            protected void Button1_Click(object sender, EventArgs e)
            {
                AreaModel model = new AreaModel();
                model.Areaname = "厦门";
                AreaBll.Add(model);
                Response.Write("成功");
            }
    
            protected void Button2_Click(object sender, EventArgs e)
            {
                UnitModel model = new UnitModel();
                model.Unitname = "软件园";
                model.Areaid = 1;
                UnitBll.Add(model);
                Response.Write("成功");
            }
    
            protected void Button3_Click(object sender, EventArgs e)
            {
                UnitModel model = UnitBll.findById(1);
                Response.Write(model.area.Areaname + "|" + model.Areaid + "|" + model.Unitname);
    
                AreaModel areamodel = AreaBll.findById(1);
                Response.Write("<br/>"+areamodel.unit.Unitname);
            }
    
            protected void Button4_Click(object sender, EventArgs e)
            {
                UnitModel model = UnitBll.findById(1);
                UnitBll.Remove(model);
                Response.Write("成功");
            }

    效果图:

    5:删除后的效果图,由于XML映衬文件设置cascade="all",都同样把数据库中两张表都删除:

                UnitModel model = UnitBll.findById(1);
                UnitBll.Remove(model);
                Response.Write("成功");
    
    或
    
                AreaModel model = AreaBll.findById(1);
                AreaBll.Remove(model);
                Response.Write("成功");

    6:one-to-one的XML属性说明:

    <one-to-one
            name="PropertyName"                               
            class="ClassName"                                  
            cascade="all|none|save-update|delete"              
            constrained="true|false"                           
            fetch="join|select"                                
            property-ref="PropertyNameFromAssociatedClass"     
            access="field|property|nosetter|ClassName"         
    />  
    
    (1)  name: 属性的名字。 
    (2)  class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。 
    (3)  cascade(级联) (可选) 表明操作是否从父对象级联到被关联的对象。 
    (4)  constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。 这个选项影响Save()
    和Delete()在级联执行时的先后顺序以及 决定该关联能否被委托(也在schema export tool中被使用). (
    5) fetch (可选 - 默认设置为select): 在外连接抓取或者序列选择抓取选择其一. (6) property-ref: (可选) 指定关联类的属性名,这个属性将会和本类的主键相对应。如果没有指定,会使用对方关联类的主键。 (7) access (可选 - 默认是 property): NHibernate用来访问属性的策略。

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

  • 相关阅读:
    wireshark1
    攻防世界Crypto高手进阶区部分Writeup
    flag_in_your_hand1
    扩展GridView之添加单选列
    C#关于日期月天数和一年有多少周及某年某周时间段的计算
    C# 开发和使用中的32个技巧
    TSQL编程的全局变量
    计算当前月底天数
    存储过程编写经验和优化措施
    ASP.NET 程序中常用的三十三种代码
  • 原文地址:https://www.cnblogs.com/wujy/p/3602200.html
Copyright © 2020-2023  润新知