一:新闻信息的表已经建立,并能顺利显示出来后,我们要对新闻信息进行分类,因此,我们现在来添加一个表: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/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架