zoukankan      html  css  js  c++  java
  • FastSpring学习笔记六(表关联)

    一:新闻信息的表已经建立,并能顺利显示出来后,我们要对新闻信息进行分类,因此,我们现在来添加一个表:FS_PT_Class_Tree

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_FS_PT_Announcement_FS_PT_Class_Tree]'and OBJECTPROPERTY(id, N'IsForeignKey'= 1)
    ALTER TABLE [dbo].[FS_PT_Announcement] DROP CONSTRAINT FK_FS_PT_Announcement_FS_PT_Class_Tree
    GO

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FS_PT_Class_Tree]'and OBJECTPROPERTY(id, N'IsUserTable'= 1)
    drop table [dbo].[FS_PT_Class_Tree]
    GO

    CREATE TABLE [dbo].[FS_PT_Class_Tree] (
        
    [ClassID] [int] NOT NULL ,
        
    [ClassName] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
        
    [ClassUrl] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
        
    [Priority] [int] NOT NULL ,
        
    [ParentID] [int] NOT NULL ,
        
    [IsActive] [int] NOT NULL 
    ON [PRIMARY]
    GO

    PT_Class_Tree:公告信息类别树
    ClassID int 类别标识
    ClassName varchar 类别名称
    ClassUrl varchar 类别链接
    Priority int 排序的优先级
    ParentID int 上级标识
    IsActive int 激活

    二:使用学习笔记二中的方法,生成该表的Model和hbm文件。代码如下:(Class_Tree.cs文件代码)

    using System;
    using System.Data;
    using System.Collections.Generic;
    using System.Text;
    using FastSpring.Base.Model;
    using FastSpring.Core.Model;
    using FastSpring.Common;

    using System.Collections;

    namespace DZ_Portal.App.Model
    ...{
        
    /**//// <summary>
        
    ///    
        
    /// </summary>

        [Serializable]
        
    public sealed class Class_Tree: BaseVersionModel
        
    ...{
            
    私有成员#region 私有成员

            
    private bool m_IsChanged;
            
    private bool m_IsDeleted;
            
    private int m_ClassID;
            
    private string m_ClassName;
            
    private string m_ClassUrl;
            
    private int m_Priority;
            
    private int m_ParentID;
            
    private int m_IsActive;
            
            
    //一对多关系:
            private IList m_Announcement;


            
    #endregion


            
    GetEntityType()#region GetEntityType()
            
    public override Type GetEntityType()
            
    ...{
                
    return typeof(Class_Tree);
            }

            
    #endregion


            
    public override bool EqualsID(int ID)
            
    ...{
                
    return this.ClassID == ID;
            }


            
    默认( 空 ) 构造函数#region 默认( 空 ) 构造函数
            
    /**//// <summary>
            
    /// 默认构造函数
            
    /// </summary>

            public Class_Tree()
            
    ...{
                m_ClassID 
    = 0;
                m_ClassName 
    = null;
                m_ClassUrl 
    = null;
                m_Priority 
    = 0;
                m_ParentID 
    = 0;
                m_IsActive 
    = 0;
                m_Announcement 
    = new ArrayList();
            }

            
    #endregion


            
    公有属性#region 公有属性

            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public int ClassID
            
    ...{
                
    get ...return m_ClassID; }
                
    set ...{ m_IsChanged |= (m_ClassID != value); m_ClassID = value; }
            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public string ClassName
            
    ...{
                
    get ...return m_ClassName; }
                
    set
                
    ...{
                    
    if (value != null)
                        
    if (value.Length > 50)
                            
    throw new ArgumentOutOfRangeException("Invalid value for ClassName", value, value.ToString());

                    m_IsChanged 
    |= (m_ClassName != value); m_ClassName = value;
                }

            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public string ClassUrl
            
    ...{
                
    get ...return m_ClassUrl; }
                
    set
                
    ...{
                    
    if (value != null)
                        
    if (value.Length > 100)
                            
    throw new ArgumentOutOfRangeException("Invalid value for ClassUrl", value, value.ToString());

                    m_IsChanged 
    |= (m_ClassUrl != value); m_ClassUrl = value;
                }

            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public int Priority
            
    ...{
                
    get ...return m_Priority; }
                
    set ...{ m_IsChanged |= (m_Priority != value); m_Priority = value; }
            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public int ParentID
            
    ...{
                
    get ...return m_ParentID; }
                
    set ...{ m_IsChanged |= (m_ParentID != value); m_ParentID = value; }
            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public int IsActive
            
    ...{
                
    get ...return m_IsActive; }
                
    set ...{ m_IsChanged |= (m_IsActive != value); m_IsActive = value; }
            }


            
    /**//// <summary>
            
    /// 对象的值是否被改变
            
    /// </summary>

            public bool IsChanged
            
    ...{
                
    get ...return m_IsChanged; }
            }


            
    /**//// <summary>
            
    /// 对象是否已经被删除
            
    /// </summary>

            public bool IsDeleted
            
    ...{
                
    get ...return m_IsDeleted; }
            }


            
    /**//// <summary>
            
    /// 对象中的所有新闻列表
            
    /// </summary>

            public IList Announcements
            
    ...{
                
    get ...return m_Announcement; }
                
    set
                
    ...{
                    m_IsChanged 
    |= (m_Announcement != value);
                    m_Announcement 
    = value;
                }

            }


            
    #endregion


            
    公有函数#region 公有函数

            
    /**//// <summary>
            
    /// 标记对象已删除
            
    /// </summary>

            public void MarkAsDeleted()
            
    ...{
                m_IsDeleted 
    = true;
                m_IsChanged 
    = true;
            }



            
    #endregion


            
    重写Equals和HashCode#region 重写Equals和HashCode
            
    /**//// <summary>
            
    /// 用唯一值实现Equals
            
    /// </summary>

            public override bool Equals(object obj)
            
    ...{
                
    if (this == obj) return true;
                
    if ((obj == null|| (obj.GetType() != GetType())) return false;
                Class_Tree castObj 
    = (Class_Tree)obj;
                
    return (castObj != null&&
                    (m_ClassID 
    == castObj.ClassID);
            }


            
    /**//// <summary>
            
    /// 用唯一值实现GetHashCode
            
    /// </summary>

            public override int GetHashCode()
            
    ...{
                
    int hash = 57;
                hash 
    = 27 * hash * m_ClassID.GetHashCode();
                
    return hash;
            }

            
    #endregion


        }

    }

    注意:这里有个定义:private IList m_Announcement;(该对象是用来设置一对多关联用的,在代码中所有涉及到m_Announcement的都是和Announcement有关系的,它是该类下的所有新闻信息列表,生成工具中生成的时候没有这个的代码的。)下面的是Class_Tree.hbm.xml代码:

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
      
    <class name="DZ_Portal.App.Model.Class_Tree,DZ_Portal.App" table="PT_Class_Tree" lazy="false">

        
    <id name="ClassID" column="ClassID" type="Int32" unsaved-value="0">
          
    <generator class="assigned"/>
        
    </id>
        
    <property column="ClassName" type="String" name="ClassName" not-null="true" length="50" />
        
    <property column="ClassUrl" type="String" name="ClassUrl" length="100" />
        
    <property column="Priority" type="Int32" name="Priority" not-null="true" />
        
    <property column="ParentID" type="Int32" name="ParentID" not-null="true" />
        
    <property column="IsActive" type="Int32" name="IsActive" not-null="true" />
        
        
    <bag name="Announcements" cascade="all" inverse="true" lazy="true">
          
    <key column="ClassID"/>
          
    <one-to-many class="DZ_Portal.App.Model.Announcement,DZ_Portal.App"/>
        
    </bag>
        
      
    </class>
    </hibernate-mapping>

    bag 节点的也是配置关联用的,该对象的生成是否有问题现在还不知道,目前没有着手创建出来测试。后面会做测试的。现在主要是为了Announcement对象关联时用到Class_Tree对象而用的。

    三、本来要继续加入BLL层和DAL层的代码,发现我这里都没有这两层的代码,但是程序一样没有出错,那么我们看看Announcement对象该怎么改:下面是Announcement.cs改后的代码:

    using System;
    using System.Data;
    using System.Collections.Generic;
    using System.Text;
    using FastSpring.Base.Model;
    using FastSpring.Core.Model;
    using FastSpring.Common;


    namespace DZ_Portal.App.Model
    ...{
        
    /**//// <summary>
        
    ///    
        
    /// </summary>

        [Serializable]
        
    public sealed class Announcement: BaseVersionModel
        
    ...{
            
    私有成员#region 私有成员

            
    private bool m_IsChanged;
            
    private bool m_IsDeleted;
            
    private int m_ItemID;
            
    private int m_ModuleID;
            
    private string m_CreateByUser;
            
    private DateTime m_CreatedDate;
            
    private string m_Title;
            
    private string m_MoreLink;
            
    private DateTime m_ExpireDate;
            
    private string m_Description;
            
    private int m_Frequency;
            
    private int m_IsActive;
            
    private int m_Priority;
            
    private int m_ClassID;

            
    //一对一关系
            private Class_Tree m_Class_Tree;


            
    #endregion


            
    GetEntityType()#region GetEntityType()
            
    public override Type GetEntityType()
            
    ...{
                
    return typeof(Announcement);
            }

            
    #endregion


            
    默认( 空 ) 构造函数#region 默认( 空 ) 构造函数
            
    /**//// <summary>
            
    /// 默认构造函数
            
    /// </summary>

            public Announcement()
            
    ...{
                m_ItemID 
    = 0;
                m_ModuleID 
    = 0;
                m_CreateByUser 
    = null;
                m_CreatedDate 
    = DateTime.MinValue;
                m_Title 
    = null;
                m_MoreLink 
    = null;
                m_ExpireDate 
    = DateTime.MinValue;
                m_Description 
    = null;
                m_Frequency 
    = 0;
                m_IsActive 
    = 0;
                m_Priority 
    = 0;
                m_ClassID 
    = 0;
                m_Class_Tree
    =null;
            }

            
    #endregion


            
    公有属性#region 公有属性

            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public Class_Tree class_tree
            
    ...{
                
    get ...return m_Class_Tree; }
                
    set ...{ m_IsChanged |= (m_Class_Tree != value); m_Class_Tree = value; }
            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public int ItemID
            
    ...{
                
    get ...return m_ItemID; }
                
    set ...{ m_IsChanged |= (m_ItemID != value); m_ItemID = value; }
            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public int ModuleID
            
    ...{
                
    get ...return m_ModuleID; }
                
    set ...{ m_IsChanged |= (m_ModuleID != value); m_ModuleID = value; }
            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public string CreateByUser
            
    ...{
                
    get ...return m_CreateByUser; }
                
    set
                
    ...{
                    
    if (value != null)
                        
    if (value.Length > 50)
                            
    throw new ArgumentOutOfRangeException("Invalid value for CreateByUser", value, value.ToString());

                    m_IsChanged 
    |= (m_CreateByUser != value); m_CreateByUser = value;
                }

            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public DateTime CreatedDate
            
    ...{
                
    get ...return m_CreatedDate; }
                
    set ...{ m_IsChanged |= (m_CreatedDate != value); m_CreatedDate = value; }
            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public string Title
            
    ...{
                
    get ...return m_Title; }
                
    set
                
    ...{
                    
    if (value != null)
                        
    if (value.Length > 100)
                            
    throw new ArgumentOutOfRangeException("Invalid value for Title", value, value.ToString());

                    m_IsChanged 
    |= (m_Title != value); m_Title = value;
                }

            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public string MoreLink
            
    ...{
                
    get ...return m_MoreLink; }
                
    set
                
    ...{
                    
    if (value != null)
                        
    if (value.Length > 150)
                            
    throw new ArgumentOutOfRangeException("Invalid value for MoreLink", value, value.ToString());

                    m_IsChanged 
    |= (m_MoreLink != value); m_MoreLink = value;
                }

            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public DateTime ExpireDate
            
    ...{
                
    get ...return m_ExpireDate; }
                
    set ...{ m_IsChanged |= (m_ExpireDate != value); m_ExpireDate = value; }
            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public string Description
            
    ...{
                
    get ...return m_Description; }
                
    set
                
    ...{
                    
    if (value != null)
                        
    if (value.Length > 2147483647)
                            
    throw new ArgumentOutOfRangeException("Invalid value for Description", value, value.ToString());

                    m_IsChanged 
    |= (m_Description != value); m_Description = value;
                }

            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public int Frequency
            
    ...{
                
    get ...return m_Frequency; }
                
    set ...{ m_IsChanged |= (m_Frequency != value); m_Frequency = value; }
            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public int IsActive
            
    ...{
                
    get ...return m_IsActive; }
                
    set ...{ m_IsChanged |= (m_IsActive != value); m_IsActive = value; }
            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public int Priority
            
    ...{
                
    get ...return m_Priority; }
                
    set ...{ m_IsChanged |= (m_Priority != value); m_Priority = value; }
            }


            
    /**//// <summary>
            
    /// 
            
    /// </summary>        

            public int ClassID
            
    ...{
                
    get ...return m_ClassID; }
                
    set ...{ m_IsChanged |= (m_ClassID != value); m_ClassID = value; }
            }


            
    /**//// <summary>
            
    /// 对象的值是否被改变
            
    /// </summary>

            public bool IsChanged
            
    ...{
                
    get ...return m_IsChanged; }
            }


            
    /**//// <summary>
            
    /// 对象是否已经被删除
            
    /// </summary>

            public bool IsDeleted
            
    ...{
                
    get ...return m_IsDeleted; }
            }


            
    #endregion


            
    公有函数#region 公有函数

            
    /**//// <summary>
            
    /// 标记对象已删除
            
    /// </summary>

            public void MarkAsDeleted()
            
    ...{
                m_IsDeleted 
    = true;
                m_IsChanged 
    = true;
            }



            
    #endregion


            
    重写Equals和HashCode#region 重写Equals和HashCode
            
    /**//// <summary>
            
    /// 用唯一值实现Equals
            
    /// </summary>

            public override bool Equals(object obj)
            
    ...{
                
    if (this == obj) return true;
                
    if ((obj == null|| (obj.GetType() != GetType())) return false;
                Announcement castObj 
    = (Announcement)obj;
                
    return (castObj != null&&
                    (m_ItemID 
    == castObj.ItemID);
            }


            
    /**//// <summary>
            
    /// 用唯一值实现GetHashCode
            
    /// </summary>

            public override int GetHashCode()
            
    ...{
                
    int hash = 57;
                hash 
    = 27 * hash * m_ItemID.GetHashCode();
                
    return hash;
            }

            
    #endregion


            
    public override bool EqualsID(int ID)
            
    ...{
                
    return this.ItemID == ID;
            }

        }

    }
    解说:代码中多了:private Class_Tree m_Class_Tree;这样一个定义,代码里面涉及到 m_Class_Tree都是后来设置关联加进入的,我们来看hbm的配置:
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
      
    <class name="DZ_Portal.App.Model.Announcement,DZ_Portal.App" table="PT_Announcement" lazy="false">

        
    <id name="ItemID" column="ItemID" type="Int32" unsaved-value="0">
          
    <generator class="native"/>
        
    </id>
        
    <property column="ModuleID" type="Int32" name="ModuleID" />
        
    <property column="CreateByUser" type="String" name="CreateByUser" not-null="true" length="50" />
        
    <property column="CreatedDate" type="DateTime" name="CreatedDate" not-null="true" />
        
    <property column="Title" type="String" name="Title" not-null="true" length="100" />
        
    <property column="MoreLink" type="String" name="MoreLink" not-null="true" length="150" />
        
    <property column="ExpireDate" type="DateTime" name="ExpireDate" not-null="true" />
        
    <property column="Description" type="String" name="Description" not-null="true" length="2147483647" />
        
    <property column="Frequency" type="Int32" name="Frequency" not-null="true" />
        
    <property column="IsActive" type="Int32" name="IsActive" not-null="true" />
        
    <property column="Priority" type="Int32" name="Priority" not-null="true" />
        
    <property column="ClassID" type="Int32" name="ClassID" not-null="true" />

        
    <many-to-one name="class_tree" class="DZ_Portal.App.Model.Class_Tree,DZ_Portal.App" column="ClassID"  unique="true"></many-to-one>

        
    </class>

      
    <query name="GetAnnouncementsOfClassID">
        
    <![CDATA[from Announcement announcement WHERE announcement.IsActive=1 AND announcement.ClassID=:param1 ORDER BY announcement.CreatedDate DESC,announcement.Priority DESC]]>
      
    </query>

    </hibernate-mapping>
    <!--1。HBM映射配置文件中“urn:nhibernate-mapping-2.0 ”需改为“urn:nhibernate-mapping-2.2”

    2。 <class name="类名,程序集名" table="Archives" >需改为<class name="类名,程序集名
    " table="Archives" lazy="false">,需要添加“lazy="false"”,不然会出现错误:
    he following types may not be used as proxies: xxxxx: method get_CreateDate should be virtual

    3。Spring.Data.NHibernate程序集变更为:Spring.Data.NHibernate12 (注意:Spring.Data.NHibernate
    程序集仍然存在,是对NHibernate1.0X的支持,Spring.Data.NHibernate12 为新增的支持NHibernate1.2.0GA的程序集)
    -->

    many-to-one是设置关联是加进去的,因为很多条新闻对应1个类对象,也可以1个新闻对应1个类对象,所以这里是设置many-to-one。

    解说:由于业务实体之间的关联不涉及到其它层次,因此这里Class_Tree中可以没有DAL和BLL层,nhibernate的实体关联只涉及到实体与实体之间的关系,只要你配置好它的hbm文件,实体类代码中使用到相关联的对象,那么,它在实体生成时会根据配置文件自动处理相关联的对象的。下面我们来看看关联后的结果。我们在Index页面中有一处是显示新闻信息的搜索结果的,我们当时显示的是Class_ID的,那么我们现在要显示Class_ID对应的类名称:于是我们可以把“<%...#DataBinder.Eval(Container.DataItem, "ClassID")%></a>”这段改成:“<%#DataBinder.Eval(Container.DataItem, "Class_Tree.ClassName")%></a>”(我都不敢相信,这样改也能正常显示出来,什么原理?知道的朋友麻烦告诉我一下)运行程序就可以看到修改后的结果了!


    原创作品出自努力偷懒,转载请说明文章出处http://blog.csdn.net/kfarvid或 http://www.cnblogs.com/kfarvid/

  • 相关阅读:
    Dns信息收集
    Top命令--性能
    一些php常用函数积累
    样本组成了整体,特例装裱了样本
    Android OKHttp 可能你从来没用过的拦截器 【实用推荐】
    一篇文章搞懂android存储目录结构
    [ES6 系列] 你真的了解ES6吗(一)
    撸了一个简易的工具库: jeasy
    SQL基础语句(详解版)
    状态管理之 Flux、Redux、Vuex、MobX(概念篇)
  • 原文地址:https://www.cnblogs.com/kfarvid/p/2251449.html
Copyright © 2011-2022 走看看