Bugnet学习总结(2)数据库

Post on by MichaelYin

由于Bugnet使用了Membership,所以数据库中会有aspnet_Applications这样以aspnet开头的表名,而这其中和user相关的权限的表诸如aspnet_UsersInRoles,aspnet_Roles,这些表在实际项目运行中是没有用到的,关于membership中的表的联系以及表的具体含义,请参考这篇文章。请猛击这里

接下来的就是具体的业务表了,在业务表中,比较重要的就是Project,Bug这两张表。

aspnet_Users和UserRoles,Roles,RolePermission,Permission,UserProjects组成了基于Project的权限管理模块所需要的表,表名所对应的意思看起来是一目了然的,在这里也就不多说了。。

在Bugnet里你创建一个Project的话,项目创建者可以在里面事先添加一些你自定义的属性,你可以决定项目成员在提交内容的时候是否必须填写这个自定义属性,这个自定义属性值你可以设定成Text,Dropdownlist,等等,关于这个功能,具体是在ProjectCustomFields,ProjectCustomFieldSelection,ProjectCustomFieldType,ProjectCustomFieldValues这几个表中实现的。

剩下的表基本上都是以Bug为中心,BugAttachment保存上传的附件,BugComment保存评论,BugHistory保存Issue的历史,BugNotification保存Issue相关的需要通知的User,Component保存Project的分类,RelatedBug保存相关Issue关系。另外的几个表都是比如Status,Type都是起着字典表的作用。标识着Issue的状态和类别。

HostSettings保存着Bugnet整体相关的设置。Log则是Log4net进行日志记录的地方。

表基本上介绍完了,Bugnet在数据操作上基本是使用Ado调用存储过程来完成数据操作的,在这一点上我也是有点不理解,如果说使用存储过程是为了性能,那它代码可以优化的地方不是没有,比如它使用的是自带的分页,而没有自己写分页,这样在数据量达到一定程度时性能肯定会首影响,而且更让我感到有点疑惑的是,代码里面使用了Datafaactory来生成需要的对象,那你为什么具体的数据操作代码要放到数据库里面去?不是要分离么?

视图的话只有BugsView一个,就是将Bug表有联系的表连接起来方便查询。。

数据库大致感觉要说的就这些。。


Bugnet学习总结(1) 前言&索引

Post on by MichaelYin

Bugnet是一个简单的Bug管理系统,这个系统对于.Net语言有一定了解而想继续深入学习的朋友来说还是不错的,系统不大,实现的功能叶相对比简单,不会像某些NB源代码会让你在学习的过程中纠结不已。其中的一些控件使用的方法在某些情况下对于我们来说还是值得借鉴的,比如其中的Ajax的实现是使用了ajaxcontroltoolkit,方法比较简单,而效果还不错。

Bugnet系统中用到的若干的我觉得有必要提及的技术我先在这里先提一下,接下来的几篇Blog会按模块进行展开,有可能会有一些遗漏的地方,欢迎大家留言补充。

  1. Membership及其相关认证控件
  2. DataFactory
  3. Log4net记录日志
  4. 用户控件的使用
  5. Rss输出
  6. nunit单元测试
  7. 邮件的读取和发送

除了使用的技术外,Bugnet在层次架构方面的一些东西也是值得借鉴的,我以后会慢慢陈述,当然了,有些地方的处理我和项目人员所想也有所偏差,也希望大家多多讨论。。。

Bugnet学习总结(2)数据库

Bugnet学习总结(3)项目文件结构

Bugnet学习总结(4)数据访问层

Bugnet学习总结(5)逻辑层

Bugnet学习总结(6)用户控件

Bugnet学习总结(7)杂


有列表List的操作所学习到的

Post on by MichaelYin

前几日coding的时候,需要实现在泛型列表中找到其中的一个对象并将其移除的功能,刚开始想的很简单,先上代码

foreach (AttachmentBox objAttachmentBox in lsAttachments)
{
    if (objAttachmentBox.AttachmentId == int.Parse(e.CommandArgument.ToString()))
    {
        lsAttachments.Remove(objAttachmentBox);
    }
}

这是我刚开始写的代码。。

运行时候VS提示错误 “集合已修改;可能无法执行枚举操作。”跑到博客园里面找了一番,发现使用foreach就会存在这个问题,因为foreach在遍历的时候只取只读的数据,如果用for的话,就能够比避免这个问题。

好吧,那就换成for循环吧。

for (int i = 0; i <= lsAttachments.Count(); i++)
{
    if (lsAttachments[i].AttachmentId == int.Parse(e.CommandArgument.ToString()))
    {
       lsAttachments.RemoveAt(i);
    }
}

运行程序显示成功,不过不小心瞄到了List的RemoveAll的方法,饿。。是虾米意思呢?打开vs帮助查了一下,原来是使用委托找到相应的对象,并移除

MSDN里面的代码是这样写的。。。。

private static bool EndsWithSaurus(String s)
{
    if ((s.Length > ...