Castle从实体类生成数据库表

文/sonce  出处/博客园

    前段时间刚接触了NHibernate,它让我这个懒写SQL语句的人偷懒了许多,就是闲编写实体类,映射文件麻烦点。后来就用CodeSmith代码生成工具来生成实体类,和映射文件。哎,弄的我更懒了。不过还是要我建立数据库表也麻烦,还不如直接写个实体类,然后来生成数据库表,这样可能我能够更闲点。恩,最近接触了Castle,看了TerryLee的Castle文章,Castle不像Nhibernate那样要通过映射文件来映射实体类的,而是采用Attribute。看到其中一篇由实体类生成数据库表的文章。
1:建立实体类
Blogs.cs

Code


Communityies.cs

Code


Castle配置就不多说了。这里的两个类用HasAndBelongsToMany特性来实现Many-Many的关联。在Global.asax的Application_Start里面做初始化操作。

Code


随便点。建立一个aspx页面,拉个Button控件,

Code


然后运行。报错了,“各表中的列名必须唯一。在表 'Blog_Community' 中多次指定了列名 'blog_Id'。 ”。那我们看看生成的SQL代码。改下代码,让Castle把sql保存到一个文件里面。
ActiveRecordStarter.GenerateCreationScripts(@"d:\a.sql");
打开这个文件。

Code


首先删除了表中的关联,然后判断数据库中是否有这些表,如果有的话就删除,然后在创建表,然后添加约束。
在TerryLee的文章中写道"生成数据库表时只有当该表不存在时ActiveRecord才会生成,否则表如果存在ActiveRecord不会做任何事情,也不会报任何错误。"。但看它生成的SQL语句并非如此。TerryLee在Castle ActiveRecord学习实践(10):深度分析Schema Pitfals  有补充说明。
回头看看刚刚的那个错误,查找到创建Blog_Community表的语句,

Code


是这里的问题。看来是Many-many关联引起的。
于是去掉其中一个类里面的HasAndBelongsToMany特性。然后生成。可以了。不知道高手们有否其他的方法呢?
看了下Castle的源代码,额,原来是封装了NHibernate.Tool.hbm2ddl.SchemaExport里面的方法。

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [Visual Studio.NET] 的这些文章也感兴趣:

使用Visual Studio 2010从分析到实施(1)——安装Visual Studio 2010 CTP2
.NET支持MPI
升级到Visual Studio 2008的10个技巧
Spring.NET在.NET新时代的尴尬
WinDbg+Rotor解析WinForm调用堆栈及实现
A*寻路算法
Apache Lucene与Lucene.Net——全文检索服务器
SunMoon框架(.Net+Ext)
在 GridView 中增加记录的方法
XNA 粒子系统入门