时间: 2020-11-21|60次围观|0 条评论

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

  • 一个Post属于一个Blog

  • 一个Blog有多个Post

使用HasMany特性 和BelongsTo特性

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

Castle ActiveRecord(三) 关联映射插图
[ActiveRecord(
"
Blogs
"
)]
Castle ActiveRecord(三) 关联映射插图

public
 
class
 Blog : ActiveRecordBase
Castle ActiveRecord(三) 关联映射插图1Castle ActiveRecord(三) 关联映射插图2

Castle ActiveRecord(三) 关联映射插图3
{
Castle ActiveRecord(三) 关联映射插图4Castle ActiveRecord(三) 关联映射插图3
Castle ActiveRecord(三) 关联映射插图4    
private IList _posts;
Castle ActiveRecord(三) 关联映射插图4Castle ActiveRecord(三) 关联映射插图3
Castle ActiveRecord(三) 关联映射插图4    [HasMany(
typeof(Post), Table="posts", ColumnKey="post_blogid")]
Castle ActiveRecord(三) 关联映射插图4    
public IList Posts
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6    
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
get Castle ActiveRecord(三) 关联映射插图3return _posts; }
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
set Castle ActiveRecord(三) 关联映射插图3{ _posts = value; }
Castle ActiveRecord(三) 关联映射插图7    }

Castle ActiveRecord(三) 关联映射插图8}


Castle ActiveRecord(三) 关联映射插图
Castle ActiveRecord(三) 关联映射插图[ActiveRecord(

"
Posts
"
)]
Castle ActiveRecord(三) 关联映射插图

public
 
class
 Post : ActiveRecordBase
Castle ActiveRecord(三) 关联映射插图1Castle ActiveRecord(三) 关联映射插图2

Castle ActiveRecord(三) 关联映射插图3
{
Castle ActiveRecord(三) 关联映射插图4Castle ActiveRecord(三) 关联映射插图3
Castle ActiveRecord(三) 关联映射插图4    
private Blog _blog;
Castle ActiveRecord(三) 关联映射插图4Castle ActiveRecord(三) 关联映射插图3
Castle ActiveRecord(三) 关联映射插图4    [BelongsTo(
"post_blogid")]
Castle ActiveRecord(三) 关联映射插图4    
public Blog Blog
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6    
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
get Castle ActiveRecord(三) 关联映射插图3return _blog; }
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
set Castle ActiveRecord(三) 关联映射插图3{ _blog = value; }
Castle ActiveRecord(三) 关联映射插图7    }

Castle ActiveRecord(三) 关联映射插图8}


Castle ActiveRecord(三) 关联映射插图

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

Castle ActiveRecord(三) 关联映射插图
[ActiveRecord(
"
Blogs
"
)]
Castle ActiveRecord(三) 关联映射插图

public
 
class
 Blog : ActiveRecordBase
Castle ActiveRecord(三) 关联映射插图1Castle ActiveRecord(三) 关联映射插图2

Castle ActiveRecord(三) 关联映射插图3
{
Castle ActiveRecord(三) 关联映射插图4Castle ActiveRecord(三) 关联映射插图3
Castle ActiveRecord(三) 关联映射插图4    
private IList _posts;
Castle ActiveRecord(三) 关联映射插图4Castle ActiveRecord(三) 关联映射插图3
Castle ActiveRecord(三) 关联映射插图4    [HasMany(
typeof(Post))]
Castle ActiveRecord(三) 关联映射插图4    
public IList Posts
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6    
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
get Castle ActiveRecord(三) 关联映射插图3return _posts; }
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
set Castle ActiveRecord(三) 关联映射插图3{ _posts = value; }
Castle ActiveRecord(三) 关联映射插图7    }

Castle ActiveRecord(三) 关联映射插图8}


Castle ActiveRecord(三) 关联映射插图

不要感到疑惑,让我们看看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(三) 关联映射插图1Castle ActiveRecord(三) 关联映射插图2

Castle ActiveRecord(三) 关联映射插图3
{
Castle ActiveRecord(三) 关联映射插图4   
using Castle.ActiveRecord;
Castle ActiveRecord(三) 关联映射插图4    [ActiveRecord(
"Posts")]
Castle ActiveRecord(三) 关联映射插图4    
public class Post : ActiveRecordBase
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6    
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4
Castle ActiveRecord(三) 关联映射插图4        
private int _postId;
Castle ActiveRecord(三) 关联映射插图4        
private string _postTitle;
Castle ActiveRecord(三) 关联映射插图4        
private string _postContents;
Castle ActiveRecord(三) 关联映射插图4        
private string _postCategory;
Castle ActiveRecord(三) 关联映射插图4        
private System.DateTime _postCreated;
Castle ActiveRecord(三) 关联映射插图4        
private bool _postPublished;
Castle ActiveRecord(三) 关联映射插图4        
private Blog _blog;
Castle ActiveRecord(三) 关联映射插图4
Castle ActiveRecord(三) 关联映射插图4        [PrimaryKey(PrimaryKeyType.Native, 
"post_id")]
Castle ActiveRecord(三) 关联映射插图4        
public int PostId
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4            
get
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
return this._postId;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图4            
set
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
this._postId = value;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图7        }

Castle ActiveRecord(三) 关联映射插图4
Castle ActiveRecord(三) 关联映射插图4        [Property(Column 
= "post_title")]
Castle ActiveRecord(三) 关联映射插图4        
public string PostTitle
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4            
get
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
return this._postTitle;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图4            
set
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
this._postTitle = value;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图7        }

Castle ActiveRecord(三) 关联映射插图4
Castle ActiveRecord(三) 关联映射插图4        [Property(Column 
= "post_contents")]
Castle ActiveRecord(三) 关联映射插图4        
public string PostContents
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4            
get
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
return this._postContents;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图4            
set
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
this._postContents = value;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图7        }

Castle ActiveRecord(三) 关联映射插图4
Castle ActiveRecord(三) 关联映射插图4        [Property(Column 
= "post_category")]
Castle ActiveRecord(三) 关联映射插图4        
public string PostCategory
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4            
get
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
return this._postCategory;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图4            
set
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
this._postCategory = value;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图7        }

Castle ActiveRecord(三) 关联映射插图4
Castle ActiveRecord(三) 关联映射插图4        [Property(Column 
= "post_created")]
Castle ActiveRecord(三) 关联映射插图4        
public System.DateTime PostCreated
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4            
get
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
return this._postCreated;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图4            
set
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
this._postCreated = value;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图7        }

Castle ActiveRecord(三) 关联映射插图4
Castle ActiveRecord(三) 关联映射插图4        [Property(Column 
= "post_published")]
Castle ActiveRecord(三) 关联映射插图4        
public bool PostPublished
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4            
get
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
return this._postPublished;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图4            
set
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
this._postPublished = value;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图7        }

Castle ActiveRecord(三) 关联映射插图4
Castle ActiveRecord(三) 关联映射插图4        [BelongsTo(
"post_blogid")]
Castle ActiveRecord(三) 关联映射插图4        
public Blog Blog
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4            
get
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
return this._blog;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图4            
set
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6            
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4                
this._blog = value;
Castle ActiveRecord(三) 关联映射插图7            }

Castle ActiveRecord(三) 关联映射插图7        }

Castle ActiveRecord(三) 关联映射插图4
Castle ActiveRecord(三) 关联映射插图4        
public static void DeleteAll()
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4            ActiveRecordBase.DeleteAll(
typeof(Post));
Castle ActiveRecord(三) 关联映射插图7        }

Castle ActiveRecord(三) 关联映射插图4
Castle ActiveRecord(三) 关联映射插图4        
public static Post[] FindAll()
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4            
return ((Post[])(ActiveRecordBase.FindAll(typeof(Post))));
Castle ActiveRecord(三) 关联映射插图7        }

Castle ActiveRecord(三) 关联映射插图4
Castle ActiveRecord(三) 关联映射插图4        
public static Post Find(int PostId)
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6        
Castle ActiveRecord(三) 关联映射插图3{
Castle ActiveRecord(三) 关联映射插图4            
return ((Post)(ActiveRecordBase.FindByPrimaryKey(typeof(Post), PostId)));
Castle ActiveRecord(三) 关联映射插图7        }

Castle ActiveRecord(三) 关联映射插图7    }

Castle ActiveRecord(三) 关联映射插图8}

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

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(三) 关联映射插图1Castle ActiveRecord(三) 关联映射插图2

Castle ActiveRecord(三) 关联映射插图3
{
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6    
get Castle ActiveRecord(三) 关联映射插图3return _posts; }
Castle ActiveRecord(三) 关联映射插图5Castle ActiveRecord(三) 关联映射插图6    
set Castle ActiveRecord(三) 关联映射插图3{ _posts = value; }
Castle ActiveRecord(三) 关联映射插图8}


Castle 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(); 
Castle ActiveRecord(三) 关联映射插图

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

转载于:https://www.cnblogs.com/ttinfo/archive/2006/07/27/461180.html

原文链接:https://blog.csdn.net/weixin_30342827/article/details/94890497

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《Castle ActiveRecord(三) 关联映射
   

还没有人抢沙发呢~