随笔-81  评论-910  文章-0  trackbacks-56

MyGeneration的几个NHibernate模板功能已经很强,但还是存在些问题。例如:Guid主键支持不佳,代码不易修改,不支持中文注释等等。所以我决定自己来改写此模版。我把一部分通用的函数提取到自己定义的基类中,这样调试和修改都方便另外增加了一部分新功能。

NHibernate里面的关系写起来也很烦人,很容易出错,所以我写了另一个模版专门生成关系代码。只需要把生成的代码拷到映射类文件和.hbm.xml文件中就可以了。

下载

如果你兴趣自己写模版,或者使用中有问题可以查看强大的代码生成工具MyGeneration

使用中发现什么问题,或者是有什么好的意见建议请及时和我联系。十分感谢!

下载完成后把DDLLY.MyGenerationTemplate.dll拷贝到MyGeneration的安装路径。把模版文件拷贝到MyGeneration的安装路径下的Templates目录里面的NHibernate目录里。

生成映射文件

运行MyGeneration,选择Edit里面的Default Settings...,进行适当的配置。如图

在Template Browser里面的NHibernate找到"DDL NHibernate Object Mapping"。运行此模版

输出路径表示生成模版的生成路径。启用nullable类型表示在.Net2.0中使用nullable类型,如果。

提示:你可以按住Ctrl或者Shift选择多个表。

Save按钮可以把的你设置存储在注册表中,下次将自动获得保存的设置。

选中你需要生成映射类的表,点Ok按钮。将生成映射文件。你可以在输出路径中找到他们。

下面是我生成的文件

/*
/*NHibernate映射代码模板
/*作者:DDL
/*版本更新和支持:
http://renrenqq.cnblogs.com/
/*日期:2006年8月14日 
*/

using System;

namespace MyNamePlace
{
    
/// <summary>
    
///    
    
/// </summary>

    [Serializable]
    
public sealed class User
    
{
        
私有成员
        
        
默认( 空 ) 构造函数
        
        
公有属性 
        
        
公有函数
        
        
重写Equals和HashCode
        
    }

}

 

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
    
<class name="MyNamePlace.User,MyAssembly" table="T_User">

        
<id name="UserId" column="UserId" type="Int32" unsaved-value="0">
            
<generator class="native"/>
        
</id>
        
<property column="UserName" type="String" name="UserName" not-null="true" length="64" />
        
<property column="Password" type="String" name="Password" not-null="true" length="32" />
        
<property column="Email" type="String" name="Email" length="64" />
        
    
</class>
</hibernate-mapping>

备注:
        我的数据库表名以"T_"开头,生成类时我会用"_"后面的内容。例如:T_Parent对应的类是Parent。如果你的表名中没有"_"。将会取表名做类名。
  如果你在设计数据表时把字段的描述加上,生成的代码文件的注释中将会有属性的描述。

注意:在把他们加入Visual Studio后别忘了设置为嵌入的资源。

生成关系

在Template Browser里面的NHibernate找到"DDL NHibernate Relation Mapping"。运行此模版

选择你需要的表,需要的关系。点OK。

我们以双向的one-to-many为例

你可以看到下面的生成代码。

//Parent
<bag name="Childs" cascade="all" lazy="true" inverse="true">
<key column="ParentId"></key>
<one-to-many class="MyNamePlace.Child,MyAssembly"></one-to-many>
</bag>

private IList m_Child=new ArrayList();

public IList Childs
{
get{return m_Child;}
set{m_Child=value;}
}


//Child
<many-to-one name="Parent" column="ParentId" 
class="MyNamePlace.Parent,MyAssembly" />

private Parent m_Parent;

public Parent Parent
{
get{return m_Parent;}
set{m_Parent=value;}
}

把他们拷贝到你生成的模版文件里面。“//Parent”后面的拷贝到Parent的映射类文件和.hbm.xml文件中。“//Child”后面的拷贝到Child的映射类文件和.hbm.xml文件中。

注意:需要把Child类和.hbm.xml里的ParentId去掉,不然会出现两个属性映射到一个字段的错误。

DDL NHibernate Relation Mapping模板使用注意:

    保持主外键的名称一致,比如T_Parent中主键名为ParetId,T_Child中与其参照的外键名也为ParentId。

    主表先选择,Parent-Child关系中先选择Parent,Person-Employee关系中先选择Person。

    多对多关系才会用到中间表下拉框。


其他的关系生成操作方法类似,我不再复述。 

如果你对关联不是很熟悉请参见NHibernate的关联映射(one-to-one,one-to-many,many-to-many)以及cascade分析。本模版生成的文件都使用NHibernate的关联映射(one-to-one,one-to-many,many-to-many)以及cascade分析一文的典型设置。可以满足绝大部分的情况。当然你也可以适当修改后使用。


模版更新:

    增加了对Guid主键的支持,中文的注释,其他代码改善,部分代码提取到自定义的基类。

     2006.8.24 修改部分bug



很多人反应模版使用问题,鉴于我这里没有.net1.0或者1.1的环境,所以把代码给出来,可以自己编译一个dll。

DDLNHibernateDotNetScriptTemplate

需要引用以下类库(都在MyGeneration的安装路径里):
Dnp.Utils.dll
DotNetScriptingEngine.dll
MyMeta.dll
PluginInterfaces.dll
Zeus.dll

posted on 2006-08-23 13:23 DDL 阅读(9308) 评论(51)  编辑 收藏 网摘 所属分类: 代码生成NHibernate

评论:
#1楼 2006-08-23 13:30 | kiler      
请问一下,怎么生成中文注释啊,我直接在模版里面写中文是乱码。
  回复  引用  查看    
#2楼[楼主] 2006-08-23 13:35 | DDL      
@kiler
我用output.saveEnc( filename, false ,Encoding.GetEncoding("utf-8") )方法
详见Zeus的帮助文件

  回复  引用  查看    
#3楼 2006-08-23 13:46 | kiler      
@DDL
问题解决了,多谢了。

  回复  引用  查看    
#4楼 2006-08-24 21:25 | ccs      
感谢分享!!
  回复  引用  查看    
#5楼 2006-08-26 15:10 | zf321[未注册用户]
[Error] (0, 0) CS0009: 未能打开元数据文件“c:\Program Files\MyGeneration\DDLLY.MyGenerationTemplate.dll”--“版本 2.0 不是兼容版本。”
是什么问题

  回复  引用    
#6楼[楼主] 2006-08-28 10:04 | DDL      
@zf321
检查的你MyGeneration我的是1.1.5.
还有我的检查.net Framework 的版本.
我的是2.0

  回复  引用  查看    
#7楼 2006-08-29 20:25 | dino2006[未注册用户]
我得也是提示不能打开"c:\Program Files\MyGeneration\DDLLY.MyGenerationTemplate.dll" 文件,怎么回事呀?楼主有没有在framework2.0上测试过?
  回复  引用    
#8楼 2006-08-30 09:16 | 心悦      
DDL,下载不了。。呵呵。。你都发表了好几天了,我今天上来才看到。
  回复  引用  查看    
#9楼[楼主] 2006-08-30 10:07 | DDL      
@dino2006
"DDLLY.MyGenerationTemplate.dll"这个文件需要拷贝到MyGeneration安装路径。例如:c:\Program Files\MyGeneration\

@心悦
下载没问题的

  回复  引用  查看    
#10楼 2006-09-11 17:35 | bigtree[未注册用户]
DDL,我的MyGeneration是1.1.5.1,也裝了.net 2.0
但是還是出現
[Error] (0, 0) CS0009: 未能打开元数据文件“c:\Program Files\MyGeneration\DDLLY.MyGenerationTemplate.dll”--“版本 2.0 不是兼容版本。
請問是何問題?

  回复  引用    
#11楼 2006-09-13 14:27 | 胖子      
我的机器上1.1和2.0两个版本都有装,但还是出现
未能打开元数据文件“d:\Program Files\MyGeneration\DDLLY.MyGenerationTemplate.dll”--“版本 2.0 不是兼容版本。”

各位高手帮帮忙呀

  回复  引用  查看    
#12楼 2006-09-14 23:14 | xxm_hl[未注册用户]
DDL,我也出现了这样的问题,怎么解决的啊?请回复。谢谢!
  回复  引用    
#13楼[楼主] 2006-09-15 11:32 | DDL      
@bigtree
@胖子
@xxm_hl
代码已在文中给出,请自行编译dll

  回复  引用  查看    
#14楼 2006-09-16 10:12 | xxm_hl[未注册用户]
我把代码在2.0中编绎更后还是出现上面的错误,实在是搞不清是哪方面出错误了!
  回复  引用    
#15楼 2006-09-17 21:23 | xpang[未注册用户]
各位...请允许我说一句...^_^
对于1.1.5版本的MyGen只要在vs 2003下编译一下就好了.
因为myGeneration如果是.net 1.1编译的,那它应该是无法使用2.0生成的dll吧?即便它是运行在2.0环境下。
我也用DDL的代码整了好久,后来拿到vs2003 Build一下(1.1编译),搞定。


后来我用了一个1.1.7(.NET2.0版)的,可以正常使用DDL提供的dll(2.0编译).


总结:
.NET1.1版的myGen对应.net 1.1的程序集
.NET2.0版的myGen对应.net 2.0的程序集

  回复  引用    
#16楼[楼主] 2006-09-18 10:16 | DDL      
我晕,我这怎么没任何问题,我这只装了.net2.0,myGeneration是1.1.1版本的.

试试xpang讲的可不可以吧

  回复  引用  查看    
#17楼 2006-09-18 11:56 | Minwell      
我把 你说得那个DLL 重新编译了一份还是不行啊
还是这个错误“未能打开元数据文件“c:\Program Files\MyGeneration\DDLLY.MyGenerationTemplate.dll”--“版本 2.0 不是兼容版本。”

我的环境是 dotnet2.0 myGeneration是1.1.5.1版本的

  回复  引用  查看    
#18楼 2006-09-18 13:00 | Minwell      
@DDL
去试一下xpang讲的!!!!

  回复  引用  查看    
#19楼 2006-09-18 13:16 | Minwell      
问题解决,,,,xpang讲的完全正确, 谢谢!!!!
  回复  引用  查看    
#20楼 2006-09-18 13:34 | Minwell      
感谢 ddl
感谢 xpang
1.1编译过的dll 我放在这儿, 有需要的朋友可以下载
http://www.cnblogs.com/Files/minwellptl/DDLLY.MyGenerationTemplate.rar">http://www.cnblogs.com/Files/minwellptl/DDLLY.MyGenerationTemplate.rar

  回复  引用  查看    
#21楼 2006-09-18 14:59 | Minwell      
ddl的这个生成工具 不支持泛型是一大遗憾啊, 在我现在的项目中使用不上。。。。。。。。。。。
  回复  引用  查看    
#22楼[楼主] 2006-09-20 09:53 | DDL      
@Minwell
你可以在模板上做修改,让他支持泛型

  回复  引用  查看    
#23楼 2006-09-25 10:11 | 豇豆[匿名][未注册用户]
请教模板的调试问题。我做了一个生成VB代码的nHibernate的模板,但是运行出错。请教如何调试模板?


以下是出错信息:
NullReferenceException
Void EngineExecuteCode(Zeus.IZeusCodeSegment, Zeus.IZeusContext)

未将对象引用设置到对象的实例。

at Zeus.DotNetScript.DotNetScriptExecutioner.EngineExecuteCode(IZeusCodeSegment segment, IZeusContext context)
at Zeus.ZeusExecutioner.ExecuteCode(IZeusExecutionHelper helper, IZeusTemplate template, IZeusContext context, ArrayList templateGroupIds)

  回复  引用    
#24楼[楼主] 2006-09-26 10:48 | DDL      
@豇豆
调试MyGeneration模板是个问题
你可以考虑看看Template Source和Interface Source里面的代码.

  回复  引用  查看    
#25楼 2006-09-27 14:24 | Devas[未注册用户]
请教一个关于 MyGeneration 的问题. 在运行用 vbScript 的模版是会提示出错. 所有vb,js的模版都会这样.. 重装了也不行, 系统是 2003 + .Net2.0. 应该怎么办呢?

Exception Type: InvalidOperationException

Method: Void AddCode(System.String)

Message: 操作在当前状态中是非法的。 (异常来自 HRESULT:0x80131509)

Trace: 在 MSScriptControl.ScriptControlClass.AddCode(String Code)
在 Zeus.MicrosoftScript.MicrosoftScriptExecutioner.EngineExecuteCode(IZeusCodeSegment segment, IZeusContext context)
在 Zeus.ZeusExecutioner.ExecuteCode(IZeusExecutionHelper helper, IZeusTemplate template, IZeusContext context, ArrayList templateGroupIds)
在 Zeus.ZeusExecutioner.ExecuteCodeSegment(IZeusCodeSegment segment, IZeusContext context)
在 Zeus.ZeusCodeSegment.Execute(IZeusContext context)
在 MyGeneration.TemplateForms.TemplateEditor._Execute()

  回复  引用    
#26楼 2006-09-27 15:47 | Minwell      
我的 支持泛型的 以及匿名方法的 模板马上就要做好了,
到现在只能支持 one-many
请问ddl 怎样在模板里 判断其外键约束关系是 one-one ?

  回复  引用  查看    
#27楼 2006-10-20 10:42 | doermlp[未注册用户]
请问搂主,如果系统需要几百个表,表之间大多数都有关联,难道每对关联关系都要一个一个的单独去生成吗,这也太麻烦了吧。请指教,也许是我没看懂。
  回复  引用    
#28楼 2006-12-08 13:37 | bobo[匿名][未注册用户]
为什么我生成后的CS文件里属性的类型为Unknown,数据库里实际的类型为varchar.
  回复  引用    
#29楼 2007-03-03 00:06 | 20024804      
这个软件太占用内存了~~~
  回复  引用  查看    
#30楼 2007-03-09 10:04 | Jinwmmail@126.com[未注册用户]
心得:
感谢楼主!

生成过程中有错误,只要将楼主最后贴出的代码重新编译代替下载包中的DLL就OK!

  回复  引用    
#31楼 2007-03-14 10:23 | highmayor[未注册用户]
我在myGeneration里面写的中文,运行后在输出里面都成了乱码,请问怎么解决啊?
  回复  引用    
#32楼 2007-03-16 10:42 | gengyu[未注册用户]
在1.2版本下运行出错,本人刚接触MyGeneration,不知道错在哪里!有朋友知道该如何解决不?
  回复  引用    
#33楼 2007-03-29 22:29 | ni[未注册用户]
请问各位大侠,MyGeneration生成的关系文件是放在什么地方的?
  回复  引用    
#34楼 2007-05-03 11:33 | Vicky[未注册用户]
MyGeneration 1.2.0.6不能用,点OK出现很多出错的地方,不能产生代码,是兼容问题吗?
  回复  引用    
#35楼 2007-06-02 10:59 | diablo[未注册用户]
我的按照您的方法总是报错
The type 'Zeus.IZeusContext' is defined in an assembly that is not referenced. You must add a reference to assembly 'PluginInterfaces, Version=1.1.5.0, Culture=neutral, PublicKeyToken=null'.
[Error] c:\Documents and Settings\diablo\Local Settings\Temp\o_tqvfgg.0.cs (52, 8) CS0012: The type 'Zeus.IZeusContext' is defined in an assembly that is not referenced. You must add a reference to assembly 'PluginInterfaces, Version=1.1.5.0, Culture=neutral, PublicKeyToken=null'.

  回复  引用    
#36楼 2007-07-19 17:50 | 李好[未注册用户]
Scripting Error

The type 'Zeus.IZeusContext' is defined in an assembly that is not referenced. You must add a reference to assembly

[Error] c:\Documents and Settings\philip.liao\Local Settings\Temp\b2wxnfy4.0.cs (52, 8) CS0012: The type 'Zeus.IZeusContext' is defined in an assembly that is not referenced. You must add a reference to assembly 'PluginInterfaces, Version=1.1.5.0, Culture=neutral, PublicKeyToken=null'.

为什么会报上面那些错误的?

  回复  引用    
#37楼 2007-08-16 15:08 | rik[未注册用户]
@bobo[匿名]
我的也是nuknow啊麻烦楼主解决下嘛

  回复  引用    
#38楼 2007-09-03 11:36 | tancky[未注册用户]
请问如何将模版中的中文在生成的代码里能正常显示啊?目前我的中文全部都是些乱码呢,怎么解决,请高手支招!
  回复  引用    
#39楼 2007-09-03 12:10 | tancky[未注册用户]
很抱歉,在最开始就有解决办法,俺没看见呵呵..谢谢.楼主!!
  回复  引用    
#40楼 2007-09-26 09:57 | 温柔的鳄鱼[未注册用户]
36楼的问题,我也出现了怎么办啊?
  回复  引用    
#41楼 2007-10-24 09:56 | 冬天1982[未注册用户]
类型“Zeus.IZeusContext”在未被引用的程序集中定义。必须添加对程序集“PluginInterfaces, Version=1.1.5.0, Culture=neutral, PublicKeyToken=null”的引用。 楼主知道是怎么回事吗
  回复  引用    
#42楼 2007-12-20 08:35 | Coolhe21cn[未注册用户]
博主给的源码我开始编译也没有通过,现经调试已通过,共享给大家
环境:vs2005, MyGeneration1.3x
添加引用:
Dnp.Utils.dll
MyMeta.dll
PluginInterfaces.dll
Zeus.dll
System.EnterpriseServices(.net页中能找到)

注意不要添加:DotNetScriptingEngine.dll的引用(DotNetScriptingEngine.dll在MyGeneration根目录下能找到)

using System;
using System.Globalization;
using System.Text.RegularExpressions;
using Dnp.Utils;
using MyMeta;
using Zeus;
using Zeus.DotNetScript;
using Zeus.UserInterface;

编译通过,其他和博主所写一样,
生成完成后把DDLLY.MyGenerationTemplate.dll拷贝到MyGeneration的安装路径。把模版文件拷贝到MyGeneration的安装路径下的Templates目录里面的NHibernate目录里。
模板通过,enjoy together!^0^


  回复  引用    
#43楼 2007-12-22 21:05 | zhuds      
感谢博主,正在学习中。。。
  回复  引用  查看    
#44楼 2008-06-12 15:53 | Jamesgd[未注册用户]
为什么我装了MyGeneration1.3.0.3后安装目录下没有DotNetScriptingEngine.dll lib
用google桌面搜索也没有找到这个文件?
谁能把这个dll发到我的邮箱啊?谢谢!
cailijunsz@126.com

  回复  引用    
#45楼 2008-06-17 01:15 | BobShang[未注册用户]
你好,我和楼上问题一样,
可以CC我一个DotNetScriptingEngine.dll
嘛?谢谢了先
sincere-angel@163.com

  回复  引用    
#46楼 2008-07-28 17:20 | csc[未注册用户]
麻烦也给我一个 谢谢 sichong.chang@softvan.com.cn
  回复  引用    
#47楼 2008-08-20 11:08 | mengshuai      
DDL大哥,我们现在用的还是VS2003,.net1.1,用MyGeneration能生成.net1.1的代码吗?
  回复  引用  查看    
#48楼 2008-08-20 14:11 | mengshuai      
DDL似乎不怎么更新blog了啊,都是06年的帖子了,难道现在不再用Nhibernate框架了?MyGeneration支持很多个框架,Nhibernate是不是用的人越来越少了?被抛弃了?
  回复  引用  查看    
#49楼 2009-03-20 22:13 | matian516
谁发一个DotNetScriptingEngine.dll到我邮箱matian516@sina.com,谢谢!
  回复  引用    



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 484216




相关文章:

相关链接: