Trunk版本的AR使用的NHibernate版本为 1.2 beta,这个版本添加了对泛型的支持。而之前我们要在AR中使用泛型(强类型集合),主要是依靠NHIbernate.Generics.dll这个第三方扩展,而这个第三方扩展的目的有两个:对强类型集合的支持和自动维护双向关联。
在使用了Trunk上的AR版本之后,我们已经可以使用诸如IList<>之类的泛型,解决了第一个问题,但是自动维护双向关联的问题呢?以下是我这两天的测试:
表结构:
CREATE TABLE Blog
(
BlogID int IDENTITY(1, 1) PRIMARY KEY,
Name varchar(50),
Author varchar(50)
)
CREATE TABLE Post
(
PostID int IDENTITY(1, 1) PRIMARY KEY,
Title varchar(50),
BlogID int FOREIGN KEY REFERENCES Blog(BlogID) Not Null,
)
实体类:
[ActiveRecord("Blog")]
public class Blog : ActiveRecordBase<Blog>
{
private int blogID;
private string name;
private string author;
private IList<Post> posts = new List<Post>();
[PrimaryKey]
public int BlogID
{
get{ return blogID;}
set {blogID = value;}
}
[Property]
public string Name
{
get{ return name;}
set {name = value;}
}
[Property]
public string Author
{
get{ return author;}
set {author= value;}
}
[HasMany(typeof(Post), Table = "Post",ColumnKey="BlogID")]
public IList<Post> Posts
{
get{return posts;}
set{posts = value;}
}
}
[ActiveRecord("Post")]
public class Post: ActiveRecordBase<Post>
{
private int postID;
private string title;
private Blog blog;
[PrimaryKey]
public int PostID
{
get{ return postID;}
set {postID= value;}
}
[Property]
public string Title
{
get{ return title;}
set {title= value;}
}
[BelongTo("BlogID")]
public Blog Blog
{
get{return blog;}
set{blog= value;}
}
}
测试类:
public BlogTest
{
private void CreateTest()
{
Blog blog = new Blog();
blog.Name = "Ken's Blog"
Post post = new Post();
post.Title = "PostTest";
//注意,如果这个版本的AR能自动维护双联接,那些不需要写下面这句代码
//post.Blog = blog;
blog.Posts.Add(post);
blog.Create();
}
}
测试结果:post并没有加到表中!怎么回事?不是到处都传说Trunk上的版本可以自动维护双向关联吗?
经过多次测试,当我把Post表结构中的: BlogID int FOREIGN KEY REFERENCES Blog(BlogID) Not Null 改为 BlogID int FOREIGN KEY REFERENCES Blog(BlogID) Null,之后,上面的测试OK了,post成功的添加到表中!
这就是说传说是真的,只不过(应该是NHIbernate)在判断表中的外键的时候出了点“问题”,不知道这是否为一个bug,也不知道是否应该向官方提交这个“问题”,如果应该,向NHibernate还是Castle提交?郁闷。
饿了,出去找点东西吃先。我会继续跟踪这个“问题”的!