江南白衣

陌上發花,可以緩緩醉矣
忍把浮名,換了淺斟低唱
我不是聖賢豪士,我衹有一腔熱血
posts - 112, comments - 418, trackbacks - 14, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

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

Posted on 2007-04-13 19:29 江南白衣 阅读(1794) 评论(6)  编辑 收藏 所属分类: Castle

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

Feedback

#1楼 [楼主]   回复  引用  查看    

2007-04-13 19:31 by levinknight      
不清楚这类Post是否能放到主页上,如果不行,请DUDU告知一声。tks

#2楼    回复  引用    

2007-04-13 22:53 by xiaolou [未注册用户]
欢迎访问
http://hi.baidu.com/activerecord

#3楼    回复  引用  查看    

2007-04-15 15:42 by 代码乱了      
不错,楼主能不能推荐一些ActiveRecord和 NHIbernate的初学者入门的学习资料?多谢

#4楼    回复  引用    

2007-04-16 03:00 by 不错 [未注册用户]
http://www.fumengxiang.cn/

太专业了 有点看不懂得!

#5楼 [楼主]   回复  引用  查看    

2007-04-16 15:07 by levinknight      
代码乱了
-------------------------
AR入门的学习资料园子里的TerryLee写得很好了,你去看他的吧,NHibernate他也写了。

#6楼    回复  引用    

2007-04-19 13:09 by row [未注册用户]
xiaolou的activerecord学习笔记不错啊

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-06-14 23:30 编辑过