三、添加表之間的關聯
現在要用ActiveRecord來體現Blog類和Post類在表中的關聯。
像我們以前說的那樣它們的關係是一對多和多對一的關係。前者我們要用到HasManyAttribute,而後者我們要用到BelongsToAttribute。
在Post 類中我們用到BelongsTo屬性
1、我們在公告欄類(post)中需要包含進一個新的欄位和屬性來表明它是屬於哪一個部落格的。
如下增加:
[ActiveRecord]
public class Post : ActiveRecordBase<Post>
{
...
private Blog blog;
...
public Blog Blog
{
get { return blog; }
set { blog = value; }
}
2、現在我們要加BelongsToAttribute標識來告訴ActiveRecord它是一個多對一關聯性。這裡注意一下它的列名就是它對應的類名。在這裡我們不用BlogId是為了方便我們理解和應用,但在實際中它其實就是BlogId欄位。
[BelongsTo("BlogId")]
public Blog Blog
{
get { return blog; }
set { blog = value; }
}
這個是非常簡單的吧,現在我們來看一看另一張表的關係怎麼體現出來。
在Blog類中使用HasMany 標識
1、同樣我們需要新增一個欄位和屬性來記錄它包含哪些公告欄。
using System;
using System.Collections.Generic;
using Castle.ActiveRecord;
[ActiveRecord]
public class Blog : ActiveRecordBase<Blog>
{
...
private IList<Post> posts = new List<Post>();
...
public IList<Post> Posts
{
get { return posts; }
set { posts = value; }
}
2、添加HasManyAttribute 標識來告訴ActiveRecord它是一對多關聯性:
[HasMany]
public IList<Post> Posts
{
get { return posts; }
set { posts = value; }
}
這個HasManyAttribute是一個有用的屬性當你想控制如下的映射關係的時候,比如:當這兩個類的關聯是雙向的時候,那麼哪一方應該完全控制這個關聯呢?這時候你想到的是在部落格(Blog)類中包含欄目類(Post)(blog.post)還是在欄目類(Post)中包含部落格類(Blog)(post.blog)?我會說用Post.Blog方案是可行的。(在部落格類中的post)這個欄目只是資訊,而且它是唯讀。所以這個時候我們可以把以上的資訊用Inverse設定到我們的標識當中:
[HasMany(Inverse=true)]
public IList<Post> Posts
{
get { return posts; }
set { posts = value; }
}
你也許會想到級聯。在用Nhibernate的時候當你刪除某一個部落格的時候(Blgo)類的時候(舉個例子)會發生什麼嗎?我們會說,刪除該部落格所擁用的欄目:
[HasMany(Inverse=true, Cascade=ManyRelationCascadeEnum.AllDeleteOrphan)]
public IList<Post> Posts
{
get { return posts; }
set { posts = value; }
}
另外你應該知道(如果如上設定了):Castle ActiveRecord 會自動根據這一列來找到映射的另一邊。這完全是可能的因為在它的另一邊(post)同樣有一個屬性BelongstoAtrribute 指回了Blog類。如果你不想這樣(在Post 中加BelongstoAtrribute屬性),那麼你不得不在(Blog)表中包含以下資訊,它應該這樣寫了:
[HasMany(
Table="Posts", ColumnKey="blogid",
Inverse=true, Cascade=ManyRelationCascadeEnum.AllDeleteOrphan)]
public IList<Post> Posts
{
get { return posts; }
set { posts = value; }
}
現在我們就開始寫一個架構,並且引用我們以上所寫的代碼。