ActiveRecord 提供一个DomainModel 工具,它使我们创建对象模型的相互关系非常容易。在上面的例子中我们已经创建了一个Blog类,它完全可以提供一个Post类及它们之间的关联。平白点讲,他们的关联是:

  • 一个Post属于一个Blog

  • 一个Blog有多个Post

使用HasMany特性 和BelongsTo特性

必须使用HasMany和BelongTo特性表达对象之间的关联。如下:

Castle ActiveRecord(三) 关联映射[ActiveRecord("Blogs")]
Castle ActiveRecord(三) 关联映射
public class Blog : ActiveRecordBase

在这个例子中,由于Post有一个BelongTo联合,ActiveRecord能够收集到这个信息并创建正确的HasMany,因此不必指定所有信息,象下面这样就可以了,注意对比“[HasMany(typeof(Post))]”:

Castle ActiveRecord(三) 关联映射[ActiveRecord("Blogs")]
Castle ActiveRecord(三) 关联映射
public class Blog : ActiveRecordBase

不要感到疑惑,让我们看看Post类,注意[BelongsTo("post_blogid")]

Castle ActiveRecord(三) 关联映射using System;
Castle ActiveRecord(三) 关联映射
using System.Collections.Generic;
Castle ActiveRecord(三) 关联映射
using System.Text;
Castle ActiveRecord(三) 关联映射
Castle ActiveRecord(三) 关联映射
namespace ActiveRecord
}

好,我们来看看怎么使用关联映射吧。先看下面的代码:

Castle ActiveRecord(三) 关联映射Blog blog = Blog.Find(1);
Castle ActiveRecord(三) 关联映射newPost.PostTitle 
= "MyPostTitle";
Castle ActiveRecord(三) 关联映射newPost.PostPublished 
= true;
Castle ActiveRecord(三) 关联映射newPost.PostContents 
= "This is a great post!";
Castle ActiveRecord(三) 关联映射newPost.PostCategory 
= "Blogging";
Castle ActiveRecord(三) 关联映射newPost.PostCreated 
= DateTime.Now;
Castle ActiveRecord(三) 关联映射blog.Posts.Add(newPost );
Castle ActiveRecord(三) 关联映射blog.Save(); 

这段代码是无法正常运行的,因为Post类是一个瞬态类,在使用时我们必须先持久化它,象下面这样就可以运行了:

Castle ActiveRecord(三) 关联映射Blog blog = Blog.Find(1);
Castle ActiveRecord(三) 关联映射Post newPost 
= new Post();
Castle ActiveRecord(三) 关联映射newPost.PostTitle 
= "MyPostTitle";
Castle ActiveRecord(三) 关联映射newPost.PostPublished 
= true;
Castle ActiveRecord(三) 关联映射newPost.PostContents 
= "This is a great post!";
Castle ActiveRecord(三) 关联映射newPost.PostCategory 
= "Blogging";
Castle ActiveRecord(三) 关联映射newPost.PostCreated 
= DateTime.Now;
Castle ActiveRecord(三) 关联映射newPost.Blog 
= blog;
Castle ActiveRecord(三) 关联映射newPost.Save();
Castle ActiveRecord(三) 关联映射blog.Posts.Add(newPost);
Castle ActiveRecord(三) 关联映射blog.Save(); 
Castle ActiveRecord(三) 关联映射

不过你的Blogs表中要有记录才行,否则会发生异常,告诉你找不到。又有人不禁想出了下面的代码:

Castle ActiveRecord(三) 关联映射Blog blog = New Blog();
Castle ActiveRecord(三) 关联映射blog.BlogName
="blogname";
Castle ActiveRecord(三) 关联映射blog.BlogAuthor
="This is my first post");
Castle ActiveRecord(三) 关联映射Post newPost 
= new Post();
Castle ActiveRecord(三) 关联映射newPost.PostTitle 
= "MyPostTitle";
Castle ActiveRecord(三) 关联映射newPost.PostPublished 
= true;
Castle ActiveRecord(三) 关联映射newPost.PostContents 
= "This is a great post!";
Castle ActiveRecord(三) 关联映射newPost.PostCategory 
= "Blogging";
Castle ActiveRecord(三) 关联映射newPost.PostCreated 
= DateTime.Now;
Castle ActiveRecord(三) 关联映射newPost.Save();
Castle ActiveRecord(三) 关联映射blog.Posts.Add(newPost);
Castle ActiveRecord(三) 关联映射blog.Save(); 

这样还是不行地,在向数据库里面保存时,Post实际需要的是BlogId,而此时Blog还没有Id

上面的代码都使用了Blog端的关联,也可以象下面这样使用:

Castle ActiveRecord(三) 关联映射Blog blog = Blog.Find(1);
Castle ActiveRecord(三) 关联映射Post newPost 
= new Post();
Castle ActiveRecord(三) 关联映射newPost.PostTitle 
= "MyPostTitle";
Castle ActiveRecord(三) 关联映射newPost.PostPublished 
= true;
Castle ActiveRecord(三) 关联映射newPost.PostContents 
= "This is a great post!";
Castle ActiveRecord(三) 关联映射newPost.PostCategory 
= "Blogging";
Castle ActiveRecord(三) 关联映射newPost.PostCreated 
= DateTime.Now;
Castle ActiveRecord(三) 关联映射newPost.Blog 
= blog;
Castle ActiveRecord(三) 关联映射newPost.Blog 
= blog; // Linking them
Castle ActiveRecord(三) 关联映射
newPost.Save();
Castle ActiveRecord(三) 关联映射

处理blog的时候,Posts不会自动地得到通知。如果想应用最新的改变,也好就是说要想使用新实例化的post,必须“刷新”它。我们可以通过设置级联变化来使用它:

Castle ActiveRecord(三) 关联映射[HasMany(typeof(Post), Table="Posts", ColumnKey="post_blogid", Cascade=ManyRelationCascadeEnum.SaveUpdate)]
Castle ActiveRecord(三) 关联映射
public IList Posts

这样的开头那段代码就能运行了:

Castle ActiveRecord(三) 关联映射Blog blog = Blog.Find(1);
Castle ActiveRecord(三) 关联映射newPost.PostTitle 
= "MyPostTitle";
Castle ActiveRecord(三) 关联映射newPost.PostPublished 
= true;
Castle ActiveRecord(三) 关联映射newPost.PostContents 
= "This is a great post!";
Castle ActiveRecord(三) 关联映射newPost.PostCategory 
= "Blogging";
Castle ActiveRecord(三) 关联映射newPost.PostCreated 
= DateTime.Now;
Castle ActiveRecord(三) 关联映射blog.Posts.Add(newPost );
Castle ActiveRecord(三) 关联映射blog.Save(); 
Castle ActiveRecord(三) 关联映射

怎么样,一定有点晕了吧,不要紧,下一节我们将讲解一下HasManyAttributeBelongsToAttribute






相关文章: