惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
V
Vulnerabilities – Threatpost
Google Online Security Blog
Google Online Security Blog
Hugging Face - Blog
Hugging Face - Blog
L
LINUX DO - 热门话题
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
D
Docker
C
Cyber Attacks, Cyber Crime and Cyber Security
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
T
Tenable Blog
P
Privacy International News Feed
Google DeepMind News
Google DeepMind News
小众软件
小众软件
Cisco Talos Blog
Cisco Talos Blog
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cisco Blogs
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
The Hacker News
The Hacker News
Project Zero
Project Zero
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threatpost
V
Visual Studio Blog
The GitHub Blog
The GitHub Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
Jina AI
Jina AI
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
Vercel News
Vercel News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
MongoDB | Blog
MongoDB | Blog
U
Unit 42
Scott Helme
Scott Helme
A
About on SuperTechFans
WordPress大学
WordPress大学
F
Fortinet All Blogs
大猫的无限游戏
大猫的无限游戏
G
GRAHAM CLULEY
Latest news
Latest news
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Schneier on Security

博客园 - 一味

[翻译]实例:在Android调用WCF服务 基于LRU淘汰的高性能缓存 不是架构的架构之五:业务层的实现与自动代理(补充) 不是架构的架构之四:业务层的实现与自动代理 不是架构的架构之三:系统基础(2)主键选择和并发 不是架构的架构之二:系统基础(1) 不是架构的架构之一:总体思路 一道算法题 技术先行or业务先行 用了一年的键盘,记录下键盘磨损的状况 一个业务系统设计构想(一) 安装VS2008/.Net3.5/.Net3.0/.Net2.0sp1失败的解决办法 常用存储过程4(K310。3版本获取物流新单据的编码) 常用存储过程3(获取编码的上级编码和短编码) 常用存储过程2(获取编码级次) 常用存储过程1(获取字符串中的第一个数值) SQL Server中Rollup关键字使用技巧 Math.Round函数四舍五入的问题 SQL Server进程阻塞的检查和解决办法(转自好友Blog)
学习NHibernate的感悟和疑惑
一味 · 2006-04-07 · via 博客园 - 一味

最近开始研究NHibernate,收获和感慨颇多,疑问也颇多,写出来和大家分享,因为接触数据持久层的时间不长,理解不当之处请大家批评指正。

闲话少说。

一、对NH的理解
NH的主要思路是把关系型数据库表映射到类中,然后通过对类的操作来实现对数据库的间接操作,NH就起到了一个桥梁的作用,这样做的好处在于,在进行软件开发时,更多的去关注数据的处理,而不用关注数据是如何保存和读取的,而且因为数据是类来展现出来的,那么相对于直接用Dataset来说,数据都是"强类型"的(其实Dataset中的数据也是强类型,只不过都是object,需要类型转换,而NH的数据类不需要类型转换),这样可以在编译期发现类型使用和字段使用的错误。

说到这里,我认为这样来处理一般的情况是没有问题,而且很方便,但是,遇到数据的字段有可能变化的情况下(不知道大家有没有做过这样的设计,比如一个单据,今天客户需要增加一个备注,明天可能需要增加一个别的字段,这样的情况下,我一般都提供给客户字段自定义的功能,用户可以自行增加数据表的字段,单据的字段也随之变化),我还没有想到在NH中很理想的解决办法。一个可能的解决方法是,提供尽可能多的未定义的字段,根据需要给这些字段予特定的含义,这样做的代价明显太大,不是我们希望看到的。

二、配置文件和O/R关系的思索

使用NH少不了配置文件,使用配置文件是很清楚的描述数据,但是问题又来了,NH在减少手工编写SQL的同时增加了编写xml配置文件的工作,虽然目前有同仁开发了通过数据库来生成配置文件和数据类的工具(这样的工具我个人认为在思路上有问题,都是从关系模型到对象模型的,这样违背了设计原则,像Hibernate提供的工具就不错,通过对象模型来生成配置文件,进而生成数据模型,虽然有时需要调整数据模型。),如果说编写数据类是为了更准确的描述数据的结构,是必不可少的,配置文件是不是显得有些多余,比如说,数据结构需要调整,那么需要改动程序的两个地方。使用配置文件会使程序代码膨胀起来,给维护带来麻烦,为什么不能用attribute来代替配置文件?我想像中的是这样的形式。

[nh_class(table="cat")]

class Cat{

     public Cat(){}

     [nh_field(column="catname",type="string")]    //type可以省去

     public string Name{set{...} get{...}}

     ......

}

在下愚钝,实在想不出NH要把数据类和配置文件分开的理由。

太困了,睡觉了,改天接着写。