参考:http://www.castleproject.org/index.php/ActiveRecord:Getting_Started
映射关系文档:http://www.castleproject.org/index.php/ActiveRecord:Mappings
依赖包:
using System;
using System.Collections;

using Castle.ActiveRecord;

namespace test
{
/// <summary>
/// Blog 的摘要说明。
/// </summary>
[ActiveRecord("Blogs")]
public class Blog : ActiveRecordBase
{
public Blog()
{
}

private int _id;
private String _name;
private String _author;

private IList _posts;



[PrimaryKey(PrimaryKeyType.Native, "blog_id")]
public int Id
{
get { return _id; }
set { _id = value; }
}

[Property("blog_name")]
public String Name
{
get { return _name; }
set { _name = value; }
}

[Property("blog_author")]
public String Author
{
get { return _author; }
set { _author = value; }
}

[HasMany(typeof(Post), Table="posts", ColumnKey="post_blogid")]
public IList Posts
{
get { return _posts; }
set { _posts = value; }
}


public static void DeleteAll()
{
DeleteAll( typeof(Blog) );
}

public static Blog[] FindAll()
{
return (Blog[]) FindAll( typeof(Blog) );
}

public static Blog Find(int id)
{
return (Blog) FindByPrimaryKey( typeof(Blog), id );
}


}
}
using System;

using Castle.ActiveRecord;

namespace test
{
/// <summary>
/// Post 的摘要说明。
/// </summary>
[ActiveRecord("Posts")]
public class Post : ActiveRecordBase
{
private int _id;
private String _title;
private String _contents;
private String _category;
private DateTime _created;
private bool _published;
private Blog _blog;

public Post()
{
_created = DateTime.Now;
}

public Post(Blog blog, String title, String contents, String category) : this()
{
_blog = blog;
_title = title;
_contents = contents;
_category = category;
}

[PrimaryKey(PrimaryKeyType.Native)]
public int Id
{
get { return _id; }
set { _id = value; }
}

[Property]
public String Title
{
get { return _title; }
set { _title = value; }
}

[Property(ColumnType="StringClob")]
public String Contents
{
get { return _contents; }
set { _contents = value; }
}

[Property]
public String Category
{
get { return _category; }
set { _category = value; }
}

[BelongsTo("blogid")]
public Blog Blog
{
get { return _blog; }
set { _blog = value; }
}

[Property]
public DateTime Created
{
get { return _created; }
set { _created = value; }
}

[Property]
public bool Published
{
get { return _published; }
set { _published = value; }
}

public static void DeleteAll()
{
ActiveRecordBase.DeleteAll( typeof(Post) );
}

public static Post[] FindAll()
{
return (Post[]) ActiveRecordBase.FindAll( typeof(Post) );
}
}

}
using System;
using System.Collections;


namespace test
{
/// <summary>
/// BlogManager 的摘要说明。
/// </summary>
public class BlogManager
{

private static BlogManager instance = null;

public BlogManager()
{

}

public static BlogManager getInstance()
{
if(instance==null)
instance=new BlogManager();
return instance;
}

public bool CreateBlog(Blog blog)
{
blog.Create();
return true;
}


}
}
using System;
using NUnit.Framework;

using test;

using System.Reflection;

using Castle.ActiveRecord.Framework.Config;
using Castle.ActiveRecord;

namespace test._TestUnitCase
{
/// <summary>
/// BlogTest 的摘要说明。
/// </summary>
[TestFixture]
public class BlogTest
{
public BlogTest()
{
}
[Test]
public void CreateBlogTest()
{
Assembly assembly = typeof(test.Blog).Assembly;
XmlConfigurationSource src = new XmlConfigurationSource(assembly.GetManifestResourceStream("test.ActiveRecord.config"));
ActiveRecordStarter.Initialize( src, typeof(Blog),typeof(Post) );

// 注意:由于存在关联,这里要初始化两个实体。
// 否则会抛出 unmapped: Post 的 Exception。


Blog blog = new Blog();

blog.Name="abcde1234";
blog.Author="stephenabcdef";
Console.WriteLine(BlogManager.getInstance().CreateBlog(blog));
}
}
}
CREATE TABLE Blogs (
blog_id int IDENTITY(1, 1) PRIMARY KEY,
blog_name varchar(50),
blog_author varchar(50)
)

CREATE TABLE Posts (
post_id int IDENTITY(1, 1) PRIMARY KEY,
post_title varchar(50),
post_contents text,
post_category varchar(50),
post_blogid int FOREIGN KEY REFERENCES Blogs (blog_id),
post_created datetime,
post_published bit
)
<?xml version="1.0" encoding="utf-8" ?>
<activerecord>
<config>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect" />
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.connection_string" value="UID=sa;Password=*****;Initial Catalog=test;Data Source=." />
</config>
</activerecord>
映射关系文档:http://www.castleproject.org/index.php/ActiveRecord:Mappings
依赖包:
You must reference the following set of assemblies to use ActiveRecord:
- Castle.ActiveRecord.dll
- Castle.Model.dll
- Nullables.dll
But ActiveRecord also depends on NHibernate, so you must reference the following as well:
- NHibernate.dll
- Castle.DynamicProxy.dll (Curious? Check DynamicProxy)
- Nullables.NHibernate.dll
- log4net.dll
- Iesi.Collections.dll
总之只要安装了 Castle.msi ,把以上包全部加进去就好了。
另外,本试验用到了 VS.NET 的测试驱动外挂 TestDriver.NET 2.0,需要安装的
下载:TestDriven.NET-2.0.1545d.zip
注意 ActiveRecord 的反射机制:
只要实体类的属性被标注为 [Property],ActiveRecord 就会自动映射到数据表中的“实体类名_属性名”字段。但是,要是在标注中也声明字段名,则需要写出完整的字段名。
Blog.cs 内容:









































































Post.cs 内容:































































































BlogManager.cs 内容:




































_TestUnitCase\BlogTest.cs 内容:











































SQL 脚本:
















内嵌资源 test.ActiveRecord.config 内容:











