博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Castle ActiveRecord框架学习(二):快速搭建简单博客网站
阅读量:6565 次
发布时间:2019-06-24

本文共 4837 字,大约阅读时间需要 16 分钟。

一、数据库

  1.数据表

  Category:类别标签表(字段Type=1为类别,Type=2为标签)

  Category_Post:类别标签与文章中间表

  Post:文章表

  Comment:评论表

  2.数据库关系图

  

  3.简单说明

  Category和Post表为多对多关系

  Post和Comment表 为一对多关系

二、实体类

  1.Category类:

// 指定数据表,Lazy为延迟加载    [ActiveRecord("Category",Lazy=true)]    public class Category : ActiveRecordBase
{ // 指定数据表中的主键 [PrimaryKey("Id")] public virtual int Id { get; set; } // 指定数据表中的列 [Property("Title")] public virtual string Title { get; set; } [Property("Description")] public virtual string Description { get; set; } [Property("DateAdded")] public virtual DateTime DateAdded { get; set; } [Property("Type")] public virtual int Type { get; set; } // 多对多 // typeof(Post):对方表的实体类,Table:关联中间表,ColumnRef:关联中间表中与对方实体相关的列,ColumnKey:关联中间表中与本实体相关的列,Lazy:延迟加载,通过本实体获取对方实体信息时,才会去数据库查询 [HasAndBelongsToMany(typeof(Post),Table = "Category_Post", ColumnRef = "Post_Id", ColumnKey = "Category_Id",Lazy=true)] public virtual IList
Posts { get; set; } public static IList
FindAllForTopCategory() { SimpleQuery
query = new SimpleQuery
(@" from Category c where c.Type=1"); return query.Execute(); } public static Category Find(int id) { return FindByPrimaryKey(id); } }
View Code

  2.Post类:

// 指定数据表    [ActiveRecord("Post",Lazy=true)]    public class Post : ActiveRecordBase
{ // 指定数据表中的主键 [PrimaryKey(PrimaryKeyType.Identity, "Id")] public virtual int Id { get; set; } // 指定数据表中的列 [Property("Subject")] public virtual string Subject { get; set; } [Property("Text")] public virtual string Text { get; set; } [Property("DateAdded")] public virtual DateTime DateAdded { get; set; } // 一对多 // typeof(Comment):对方的实体类,Table:对方表名,ColumnKey:对方表的外键,Lazy:延迟加载 [HasMany(typeof(Comment), Table = "Comment", ColumnKey = "PostId",Lazy=true)] public virtual IList
Comments { get; set; } // 多对多 [HasAndBelongsToMany(typeof(Category),Table="Category_Post",ColumnRef="Category_Id",ColumnKey="Post_Id",Lazy=true)] public virtual IList
Categorys { get; set; } public static Post Find(int id) { return FindByPrimaryKey(id); } }
View Code

  3.Comment类:

// 指定数据表    [ActiveRecord("Comment",Lazy=true)]    public class Comment : ActiveRecordBase
{ // 指定数据表中的主键 [PrimaryKey("Id")] public virtual int Id { get; set; } // 指定数据表中的列 [Property("Author")] public virtual string Author { get; set; } [Property("Text")] public virtual string Text { get; set; } [Property("DateAdded")] public virtual DateTime DateAdded { get; set; } // 多对一,对应Post的的Comments属性 [BelongsTo(Column = "PostId")] public virtual Post Post { get; set; } }
View Code

  说明:

  1.Category和Post在数据库中是多对多关系,由一张中间表Category_Post互相关联,但在C#实体类中则不需要为Category_Post建立实体模型 。

  2.多对多在Castle ActiveRecord中通过HasAndBelongsToMany特性进行关联,具体的使用在代码注释中以说明,见Category类和Post类中的代注释。(,)

  3.一对多在Castle ActiveRecord中通过HasAndBelongsToMany特性进行关联,具体的使用在代码注释中以说明,见Post类中的代注释。()

  4.多对一在Castle ActiveRecord中通过BelongsTo特性进行关联,具体的使用在代码注释中以说明,见Comment类中的代注释。()

  5.Lazy代表延迟加载,可以为实体类本身进行添加,也可以为多对多和一对多等关系字段进行添加,具体效果可以自行查看。(,)

  6.启动Lazy模式时,实例类中的上述必须为virtual。

三、页面展示

  首页:

  主要代码:

private void LoadIndexPost()        {            StringBuilder sb = new StringBuilder();            using (new SessionScope())            {                IList
PostListForIndex = Model.Post.FindAll(); foreach (Model.Post post in PostListForIndex) { sb.Append("

" + post.Subject + "

"); sb.Append("
"); sb.Append("
"); sb.Append("
阅读全文>>
" + post.DateAdded.ToString("yyy-MM-dd") + ""); sb.Append("
评论数:" + post.Comments.Count() + ""); sb.Append("
标签:"); post.Categorys.ForEach(c => sb.Append("[" + c.Title + "]")); sb.Append("
"); } PostContent = sb.ToString(); } }
View Code

  说明 :

  当在实体类中启用Lazy模式时,通过关联从一个实体获取另一个实体的信息时,必须使用new SessionScope(),开始时使用Model.Post.FindAll()只获取需要的文章数据,由于启用了Lazy模式,没有获取与 Post表相关联的所有数据,但是在后续代码中发现需要评论表中的数据和类别标签表中的数据,那就要保存当前的Session,以便后续的数据库操作。

四、参考资料

  官方资料:http://docs.castleproject.org/

  中文资料:

  模版提供:

五、演示代码

  

 

转载地址:http://hndjo.baihongyu.com/

你可能感兴趣的文章
工作中简单的kettle使用
查看>>
spark shuffle:分区原理及相关的疑问
查看>>
C#匿名委托
查看>>
Laravel5.5 使用第三方Vendor添加注册验证码
查看>>
06- Linux下sublime下载与使用
查看>>
前端文摘:Web 开发模式演变历史和趋势
查看>>
将图片序列转化为视频文件
查看>>
jQuery的文档操作***
查看>>
CODING Pages 服务全面升级,更快更稳更可靠!
查看>>
js 小数取整,js 小数向上取整,js小数向下取整
查看>>
vue-cli3.0
查看>>
window.location.replace vs window.location.href
查看>>
CVPR 2018:阿里提出应用 LocalizedGAN 进行半监督训练
查看>>
被劫持的wordpress.com账户被用来感染站点
查看>>
分享一下最近看的东西
查看>>
《大数据、小数据、无数据:网络世界的数据学术》一 第2章 何为数据 2.1 引言...
查看>>
WatchStor观察:2008年存储大事记
查看>>
寓教于乐的顶峰:新一届大学生集群竞赛火热开战
查看>>
《计算机科学与工程导论:基于IoT和机器人的可视化编程实践方法第2版》一第1章 职业发展机会和团队建设...
查看>>
HBase BlockCache系列 - 探求BlockCache实现机制
查看>>