登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
签到
每天签到奖励2-10圆
导读
排行榜
TG频道
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
VIP申请
VIP网盘
网盘
联系我们
发帖说明
每日签到
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
【翻译】How-To: Using the N* Stack, part 2
【翻译】How-To: Using the N* Stack, part 2
[ 复制链接 ]
些耨努
2025-5-29 20:04:28
在上一篇文章当中,我们建立了一个基于 NHibernate 和 Ninject 的 ASP.NET MVC 应用程序,设置了解决方案的结构和一些第三方程序集的引用。
在本篇中,我们将介绍持久化对象模型的建立。持久化对象模型是一组对象,用于我们保存数据到数据库。
注意
:这是一个示例程序,和正确的应用程序结构有很大的差异。正如在 ALT.NET 空间里的大部分高级话题一样,Ayende 有一些关于持久化对象和领域对象的差别的信息。本系列的目的和它们是一样的。
首先,我们建立基于普通旧式CLR对象(POCO)的持久化模型结构。我喜欢在 Visual Studio 的类设计器中做这些事。因为它有助于我们专注在高层的实体和关系上面,而不用徘徊在具体的实现代码上。
以下是我们将要使用的模型图:
首先我们来看下 Course 和 Section 之间的关系。在 Course 类中有一个 ICollection 类型的属性,这个属性和 Section 类是一对多的关系。同样,在 Section 类中也存在一个 Course 属性,和Course 类是多对一的关系。
Code
public class Course
{
public ICollection Sections {
get { }
set { }
}
}
public class Section
{
public Course Course {
get { }
set { }
}
//Other properties here
}
好了,我们建立完了所需要的全部实体类。不过因为我们使用NHibernate,所以这里还有几个小要求:
所有的方法和属性都必须是可重写的,也就是在C#中必须声明为 virtual 。
除非你使用了依赖注入字节码提供者,否则你需要声明一个无参的构造函数。如果你不知道字节码提供者是什么,不用急,我们稍后会介绍的。如果你没有写任何构造函数,也没有错,因为默认会生成出一个无参的构造函数。不过因为 NHibernate 的要求,当你添加一个带有参数的构造函数的时候,也必须要加上一个没有参数的构造函数。
当某些需要用到只读属性的时候,你可以有一些选择。你可以告诉 NHibernate 你的命名约束为后备字段。不过我不喜欢这样,我喜欢将属性设置成可读写的,并且将 setter 设置为 rotected 。如果你刚开始使用 NHibernate 的话,你可能还没有见过这样的情况。
Code
public class Course : Entity
{
private ICollection m_Sections = new HashSet();
public virtual ICollection Sections {
get { return m_Sections; }
protected set { m_Sections = value; }
}
}
我所有的集合属性都是这样设置的。你可以操作集合里的内容,但你不能替换另外一个没有继承此类的实例和重写属性。 如果你要是将这个属性设置成只读的,你就必须在 NHibernate 里配置 m_Sections 使用反射,这是一个完全没有必要的操作。我这样的做法更容易,而且得到的结果也都是相同的。
此外,请注意我们是从 Entity 类继承的,更多内容请继续关注。
接下来我们说说数据库。这些实体类最终都将变成数据库里的表,你会将表的主键设置成什么样的呢? Fabio Maulo 有一篇非常好的随笔介绍了不同的 NHibernate 主键策略,他在 这篇随笔 中也提到了标示列可能不是主键的最佳选择。
那么,什么才是最好的选择呢? 其实这是个见仁见智的问题。多亏 NHibernate ,我不想关注过多的数据库细节,所以我喜欢 guid 。你也可以选择你喜欢的,或者可以说是数据库管理员喜欢的。
现在,你打算如何确定对象的主键呢? 在我看来,这的确是一个持久化细节 – 就是你的对象不应该真正的和它打交道。这就是为什么我们要把它隐藏在基类中,请记住我们要从 Entity 类继承。
public abstract class Entity
{
private Guid m_ID;
public virtual Guid ID {
get { return m_ID; }
protected set { m_ID = value; }
}
}这篇讲的就是这么多了,在下篇教程里,我们将介绍如何配置 NHibernate 和建立数据库。
示例代码下载:/Files/LeoXing/NStack/NStackExample.Part2.CSHARP.zip
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
翻译
How
To
Using
the
相关帖子
The translation of article about MT-3000
WPF中使用 using prism.region 报错
Web server failed to start. Port 8080 was already in use. 端口被占用
【LangGraph】Human-in-the-loop示例之人工干预shell命令执行
CF1849E - Max to the Right of Min
命令行神器 The Fuck,敲错命令的后悔药
Can‘t get terminal settings: The handle is invalid. 的解决方法
PWN手的从成长之路-08-not_the_same_3dsctf_2016-溢出+函数调用劫持
OpenAiTx 帮助 Gitee 项目翻译出海、开拓国际社群
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
The translation of article about MT-3000
0
546
顶豌
2025-08-20
业界
WPF中使用 using prism.region 报错
0
298
拴茅劾
2025-08-22
业界
Web server failed to start. Port 8080 was already in use. 端口被占用
0
597
粹脍誊
2025-09-01
业界
【LangGraph】Human-in-the-loop示例之人工干预shell命令执行
0
572
套缈
2025-09-02
业界
CF1849E - Max to the Right of Min
0
791
撙仿
2025-09-12
业界
命令行神器 The Fuck,敲错命令的后悔药
0
891
站竣凰
2025-09-28
业界
Can‘t get terminal settings: The handle is invalid. 的解决方法
0
84
孟茹云
2025-10-02
安全
PWN手的从成长之路-08-not_the_same_3dsctf_2016-溢出+函数调用劫持
0
345
谷江雪
2025-10-04
业界
OpenAiTx 帮助 Gitee 项目翻译出海、开拓国际社群
0
86
辗振
2025-10-06
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
科技
签约作者
程序园优秀签约作者
发帖
些耨努
2025-5-29 20:04:28
关注
0
粉丝关注
19
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994888
dage888
999994
3934307807
993690
4
富账慕
10007
5
刎唇
9993
6
柴古香
9989
7
匝抽
9986
8
孙淼淼
9989
9
筒濂
9977
10
凌彦慧
9985
查看更多