Castle ActiveRecord学习实践(9):使用ActiveRecord的一些技巧

摘要:本文将会介绍使用 ActiveRecord 中的一些技巧。
 
主要内容
1 .由实体类生成数据表
2 .运行存在的 SQL 脚本
3 .使用空属类型
4 .使用枚举类型的属性
5 .使用 NHibernate 中的日志记录
 
一.由实体类生成数据表
在前面所用到的例子中我们都是先有数据表结构,然后才有实体类,然而这会让很多朋友认为 ORM 怎么变成了 ROM 了,其实这只是我们平时的一个开发时的习惯问题, ActiveRecord 是支持先有实体类,再由实体类生成数据库表。只不过我们可以在开发中根据项目的实际情况在这两种之间选择。看下面的代码,要生成数据库表结构,在实体类中需要多提供一些信息,是否为空,字段长度等。
ActiveRecordStarter.CreateSchema() 方法就可以了。
[ActiveRecord( " Blogs " )]

public  class  Blog : ActiveRecordBase

{

    
private int _id;

    
private String _name;

    
private String _author;

 

    [PrimaryKey(PrimaryKeyType.Native, 
"blog_id")]

    
public int Id

    
{

        
get return _id; }

        
set { _id = value; }

    }


 

    [Property(
"blog_name", NotNull=true, Length=25)]

    
public String Name

    
{

        
get return _name; }

        
set { _name = value; }

    }


 

    [Property(
"blog_author", NotNull=true, Length=50)]

    
public String Author

    
{

        
get return _author; }

        
set { _author = value; }

    }


}

要生成数据库表需要调用
public  void  Initli()

{

    XmlConfigurationSource source 
= new XmlConfigurationSource("MyConfig.xml");

    

    ActiveRecordStarter.Initialize( source, 
typeof(Blog),typeof(Post),typeof(Custom));

    ActiveRecordStarter.CreateSchema();

}

这里需要注意两点:

 
1 .生成数据库表时只有当该表不存在时 ActiveRecord 才会生成,否则表如果存在 ActiveRecord 不会做任何事情,也不会报任何错误。
2 .如果在实体类中没有指定字段的长度和是否为空,则默认生成的字段是允许为空的,且字符类生成后的字段类型为 Nvarchar ,长度为 255
 
二.运行存在的 SQL 脚本
有时候我们会想在 ActiveRecord 框架启动时运行一个已经存在的 SQL 脚本来生成数据库表结构, ActiveRecord 同样也提供了这样的功能,通过调用 ActiveRecordStarter.CreateSchemaFromFile() 来实现。示例代码如下:
public  void  Initli()

{

    XmlConfigurationSource source 
= new XmlConfigurationSource("MyConfig.xml");

    

    ActiveRecordStarter.Initialize( source, 
typeof(Blog));

 

    ActiveRecordStarter.CreateSchemaFromFile(
"MySqlScript.sql");

}
 
三.使用空属类型
在进行数据库操作时,有时候需要进行空值的处理,在 ActiveRecord 中给我们提供了一组空属类型,可以方便的进行处理,比如可以这样写属性:
ActiveRecord 提供的空属类型与实际类型对照表
[Property]

public  NullableDateTime CreatedDate

{

    
get return _createdDate; }

    
set { _createdDate = value; }

}


 

[Property]

public  NullableInt32 Count

{

    
get return _count; }

    
set { _count = value; }

}

看一下
CLR Basic Type
Nullable Type
System.Boolean
Nullables.NullableBoolean
System.Byte
Nullables.NullableByte
System.Char
Nullables.NullableChar
System.DateTime
Nullables.NullableDateTime
System.Decimal
Nullables.NullableDecimal
System.Double
Nullables.NullableDouble
System.Guid
Nullables.NullableGuid
System.Int16
Nullables.NullableInt16
System.Int32
Nullables.NullableInt32
System.Int64
Nullables.NullableInt64
System.SByte
Nullables.NullableSByte
System.Single
Nullables.NullableSingle
注意在使用空属类型时需要添加以下引用
Nullables.dll

Nullables.NHibernate.dll
 
四.使用枚举类型属性
ActiveRecord 中我们可以定义一个属性的类型为枚举类型,示例代码:
StatusType 属性时,可以这样赋值:  
public  class  Post : ActiveRecordBase

{

    
//

 

    
private StatusType _status_type_id;

 

    
public enum StatusType

    
{

        Editing 
= 0,

        Published 
= 1,

        Archived 
= 2

    }


 

    [Property(
"status_id")]

    
public StatusType Status

    
{

        
get return _status_type_id; }

        
set { _status_type_id = value; }

    }


}

在使用该实体类的
Post.Status  =  Post.StatusType.Archived;
五.使用 NHibernate 的日志记录
用过 NHibernate 的朋友都知道, NHibernate 是用 Log4net 来记录日志的,在 ActiveRecord 中也可以通过简单的配置来使用 Log4net 记录。配置示例:
ActiveRecordStarter.Initialize() 方法之前
<? xml version="1.0" encoding="utf-8"  ?>

< configuration >

    
< configSections >

        
< section  name ="nhibernate"  type ="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"  />

        
< section  name ="activerecord"  type ="Castle.ActiveRecord.Framework.Config.ActiveRecordSectionHandler, Castle.ActiveRecord"  />

        
< section  name ="log4net"  type ="log4net.Config.Log4NetConfigurationSectionHandler, log4net"  />

    
</ configSections >

    
< activerecord >      

    
</ activerecord >

    
< log4net >

        
<!--  Define some output appenders  -->

        
< appener  name ="trace"  type ="log4net.Appender.TraceAppender, log4net" > Õ

            
< layout  type ="log4net.Layout.PatternLayout,log4net" >

                
< param  name ="ConversionPattern"  value ="%d [%t] %-5p %c [%x] &lt;%P{user}&gt; - %m%n"  />

            
</ layout >

        
</ appener > Õ

        
< appener  name ="console"  type ="log4net.Appender.ConsoleAppender, log4net" > Õ

            
< layout  type ="log4net.Layout.PatternLayout,log4net" >

                
< param  name ="ConversionPattern"  value ="%d [%t] %-5p %c [%x] &lt;%P{user}&gt; - %m%n"  />

            
</ layout >

        
</ appener > Õ

        
< appener  name ="rollingFile"  type ="log4net.Appender.RollingFileAppender,log4net" > Õ

            
< param  name ="File"  value ="log.txt"  />

            
< param  name ="AppendToFile"  value ="true"  />

            
< param  name ="RollingStyle"  value ="Date"  />

            
< param  name ="DatePattern"  value ="yyyy.MM.dd"  />

            
< param  name ="StaticLogFileName"  value ="true"  />

            
< layout  type ="log4net.Layout.PatternLayout,log4net" >

                
< param  name ="ConversionPattern"  value ="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n"  />

            
</ layout >

        
</ appener > Õ

        
< root >

            
<!--  priority value can be set to ALL|INFO|WARN|ERROR  -->

            
< priority  value ="ALL"  />

            
< appener-ref  ref ="rollingFile"  /> Õ

        
</ root >

    
</ log4net >

    
< nhibernate >

        
<!--  with this set to true, SQL statements will output to the console window if it's a console app  -->

        
< add  key ="hibernate.show_sql"  value ="true"  />

    
</ nhibernate >

</ configuration >

初始化配置在调用
public  void  Initli()

{

    XmlConfigurationSource source 
= new XmlConfigurationSource("MyConfig.xml");

    log4net.Config.XmlConfigurator.Configure();

    ActiveRecordStarter.Initialize( source, 
typeof(Blog));

}

六.Hooks

 
有时候我们会在保存,加载,删除等操作时做一些必需的处理,这时可以通过重载以下三个方法来实现:
比如说我们想在保存的时候设置 Post 的创建时间为当前时间,可以这样去写
BeforeSave(IDictionary state) 

BeforeLoad(IDictionary state) 

BeforeDelete(IDictionary state)

protected  override  bool  BeforeSave(IDictionary state)

{

    state[
"Created"= DateTime.Now;

    
return true;

}
 
本文就到这里了,同时本篇也是 Castle ActiveRecord 学习实践系列的最后一篇,过几天我会提供一个完整的 ActiveRecord 的例子程序。下面有时间我会继续写 Castle 中的其他部分,包括 IOC Facility Aspect# DynamicProxy 等。
 
参考资料
文中很多内容来自于Castle的官方网站http://www.castleproject.org
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值