MVC+NHibernate
1.NHibernate 搭建
1.1 架构说明
Domain 数据实体和数据库映射文件。
Data 数据层存放数据库的操作及Nhibernate辅助类。引用Iesi.Collections.dll,NHibernate.dll和类库Domain
Business 业务逻辑类。引用类库项目Domain, Data
Web web项目。需引用类库项目Domain, Business
1.2 配置说明
本例使用mssql数据库,所以从pakage文件夹找到MSSQL.cfg.xml文件复制内容插入web.config文件并修改数据库连接串和映射程序集并在configSetions添加NHibernate
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
2.NHibernate持久化类和映射文件
2.1使用CodeSmith 安装CodeSmith后,把模板文件复制粘贴到My Template文件夹中(截图已经加入了模板文件)
2.2 接着右击NHibernate.cst文件弹出框维护文件生成路径、程序集、命名空间、 数据库信息等信息,点击右下角Generate按钮执行。使用codeSmith会全表生成且每个表必须以id为主键
2.2 使用动软 安装动软连接数据库,右键需要生成的表选择“模板代码生成”-->右侧模板管理中选择nhibernate模板生成即可。
两种工具都可以生成NHibernate开发所需文件,但是生成内容有所不同。比如我数据库表名DP002_ETItem,前者生成类会去掉下划线且字段也会做相应处理,因为其生成的cfg.xml中做了相关处理。
1 <?xml version="1.0" encoding="utf-8" ?> 2 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 3 <class name="MyNamespace.Data.DP002ETItem, MyApp.MyAssembly" table="DP002_ETItem" dynamic-insert="true" dynamic-update="true" > 4 <cache usage="read-write" region="reg_DP002_ETItem"/> 5 <id name="Id" type="Decimal" unsaved-value="null"> 6 <column name="DP002_ID" length="9" sql-type="numeric" not-null="true" unique="true"/> 7 <generator class="assigned" /> 8 </id> 9 <property name="ET101code" type="String"> 10 <column name="ET101_code" length="50" sql-type="varchar" /> 11 </property> 12 <property name="DP002ITemName" type="String"> 13 <column name="DP002_ITemName" length="20" sql-type="varchar" /> 14 </property> 15 <property name="DP002type" type="Int32"> 16 <column name="DP002_type" length="4" sql-type="int" /> 17 </property> 18 <property name="DP002other" type="String"> 19 <column name="DP002_other" length="50" sql-type="varchar" /> 20 </property> 21 <property name="EC004Code" type="String"> 22 <column name="EC004_Code" length="10" sql-type="varchar" /> 23 </property> 24 </class> 25 </hibernate-mapping>
而动软生成的文件更贴合实际表结构。
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <class name="Domain.DP002_ETItem, Domain" table="DP002_ETItem" dynamic-insert="true" dynamic-update="true"> <id name="DP002_ID" column="DP002_ID" type="decimal" unsaved-value="0"> <generator class="native" /> </id> <property name="ET101_code" column="ET101_code" type="string" /> <property name="DP002_ITemName" column="DP002_ITemName" type="string" /> <property name="DP002_type" column="DP002_type" type="int" /> <property name="DP002_other" column="DP002_other" type="string" /> <property name="EC004_Code" column="EC004_Code" type="string" /> </class> </hibernate-mapping>
总之,两种工具都可以简化开发,我更倾向于使用后者。