博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ActiveRecord自动维护双向关联的测试

Posted on 2007-04-13 19:29  江南白衣  阅读(2045)  评论(6编辑  收藏  举报

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提交?郁闷。
  饿了,出去找点东西吃先。我会继续跟踪这个“问题”的!