微型项目实践(9):页面的数据访问策略
问题。
我们经常会在用户登录的时候,在Session中储存登陆的用户: User user = GetLoginUser(username, password); if (user != null) Session["CurrentUser"] = user; else Response.Redirect("Login.aspx"); 这样以后我们就可以用Session["CurrentUser"]取得当前用户了。当用户新建一篇日志时,我们会使 用类似下面的代码: Blog blog = new Blog(); blog.Creator = Session["CurrentUser"] as User; blog.Save(Database); 问题来了:上面两个代码通常来说不是发生在一个页面中,也就是说,从数据库中读取该user的 DataContext早已不存在了,而新的、用于存储Blog的DataContext会认为这个blog相关的Creator是一个 “新”的User,所以会在数据库中插入一条新的User记录,而不是和原来的User记录建立关联!为了避免 这个情况,我们必须用Attach方法将Session["CurrentUser"]附加到新的DataContext中,上面的代码要 这么改: Database.Users.Attach(Session["CurrentUser"] as User); Blog blog = new Blog(); blog.Creator = Session["CurrentUser"]; blog.Save(Database); 但是假设User还有关联的实体,比如Role、Power之类的东西,就需要全部附加上!否则就会插入新的 关联记录!这几乎是不可能的,所以我们要保证每一个页面周期中所有的实体来源于同一个DataContext ,对于上面这个例子,解决办法是不保存User,而保存UserID: User user = GetLoginUser(username, password); if (user != null) Session["CurrentUserID"] = user.ID; else Response.Redirect("Login.aspx"); 这样我们就可以在添加日志时这样写: Blog blog = new Blog(); blog.Creator = Database.Users.GetByID(Convert.ToInt32(Session["CurrentUserID"])); blog.Save(Database); 进一步,我们可以在PageBase中加载User,考虑在PageBase中存在以下代码: private User _CurrentUser; public User CurrentUser { get { if(Session["CurrentUserID"] == null) return null; if(_CurrentUser == null) _CurrentUser = Database.Users.GetByID(Convert.ToInt32(Session ["CurrentUserID"])); return _CurrentUser; } } 这样我们就可以使用以下的代码建立日志了: Blog blog = new Blog(); blog.Creator = CurrentUser; blog.Save(Database); 关于PageBase的用处还有很多,包括但不限于以下这些: 构造Database。 构造当前User。 判断当前用户是否具有该页面的访问权限。 根据当前用户定制页面:加入不同的Css等。 另外,基于PageBase的扩展方法,将对所有页面有效,这点常常用于执行JavaScript。 下一篇中,我们开始编写我们第一个页面。 本文配套源码 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |