ASP.NET MVC 企业级实战 —— 创建用户权限管理范例程序(二)
2012-11-21 14:56 E2Home 阅读(6810) 评论(8) 编辑 收藏 举报上一篇,大家反应比较热烈,给了我很大的鼓励,不管是褒奖的还是贬低的,都是认真看过之后对框架的一个反馈。
由于上一篇没有说清楚开发环境,导致很多用户在VS 2012 无法安装NBlock框架模版。这次我着重说明一下,NBlock框架目前在支持 VS 2010 ,其他的开发环境没有测试过。
NBlock框架采用ASP.NET MVC3作为UI展现,用JQuery 插件提高用户交互体验,ORM采用微软的Entity Framework 4.3.1的一套快速开发框架。
用户权限管理的访问地址:http://42.121.122.31/, 速度可能会慢,因为我是通过园豆购买的阿里云主机,最差的那种配置。
下面进入我们的正题,一步一步来创建用户权限管理范例程序,接上一篇的内容如下:
五、 创建数据库
我们将使用SQL Server 2005数据库来存储范例程序OrgAuth的所有数据,首先我们要创建一个数据库名叫OrgAuth,然后向数据库增加用户信息表(NB_UserInfo)。如下图所示。在OrgAuth数据库的NB_UserInfo表,需要设置Id为主键,存放的是Guid的字符串,同时有CreateUserId、CreateUser、CreateDate、UpdateUserId、UpdateUser、UpdateDate六个必填字段的创建信息和修改信息。
说明:NBlock框架会自动处理创建和修改信息的六个字段,开发人员不需要额外处理。
NBlock框架模板创建的应用系统会默认自带枚举字典的管理,用到两张表NB_EnumItem和 NB_EnumType,而这两张表是放在Sqlite数据库的,所以我们需要将这两张表移植到我们上面创建的OrgAuth数据库(Sql Server 2005)。
在OrgAuth数据库中,执行以下Sql脚本,生成应用系统默认自带的两种表NB_EnumItem和 NB_EnumType。
CREATE TABLE [dbo].[NB_EnumItem]( [Id] [nvarchar](50) NOT NULL, [EnumCode] [nvarchar](50) NOT NULL, [EnumName] [nvarchar](100) NOT NULL, [FirstChar] [nvarchar](50) NULL, [TypeId] [nvarchar](50) NULL, [TypeCode] [nvarchar](50) NULL, [ParentId] [nvarchar](50) NULL, [ParentCode] [nvarchar](50) NULL, [SeqNo] [int] NOT NULL, [Remark] [nvarchar](1000) NULL, [CreateUserId] [nvarchar](50) NOT NULL, [CreateUser] [nvarchar](100) NOT NULL, [CreateDate] [datetime] NOT NULL, [UpdateUserId] [nvarchar](50) NOT NULL, [UpdateUser] [nvarchar](100) NOT NULL, [UpdateDate] [datetime] NOT NULL, CONSTRAINT [PK_NB_EnumItem] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO CREATE TABLE [dbo].[NB_EnumType]( [Id] [nvarchar](50) NOT NULL, [TypeCode] [nvarchar](50) NOT NULL, [TypeName] [nvarchar](100) NOT NULL, [IsSystem] [bit] NULL, [SeqNo] [int] NULL, [Remark] [nvarchar](1000) NULL, [CreateUserId] [nvarchar](50) NOT NULL, [CreateUser] [nvarchar](100) NOT NULL, [CreateDate] [datetime] NOT NULL, [UpdateUserId] [nvarchar](50) NOT NULL, [UpdateUser] [nvarchar](100) NOT NULL, [UpdateDate] [datetime] NOT NULL, CONSTRAINT [PK_NB_EnumType] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO最后我们增加一些用户信息数据到NB_UserInfo表,这些数据在随后的应用系统开发中会用到,如下图所示。
六、 创建Model对象
在Model-View-Controller 框架中,Model 表示应用程序的数据对象,以及相应的业务领域逻辑,包括数据验证和业务规则。Model 是NBlock框架创建的应用程序的核心部分,下面我们会看到Model 的作用。
ASP.NET MVC 框架支持使用任意数据访问技术,开发人员可以选择大量的.NET 数据访问技术实现Model层,如Entity Framework、LINQ to Entities、NHibernate、LLBLGen Pro、SubSonic、WilsonORM或者基本的ADO.NET DataReaders、DataSets 等等。
对于本范例程序OrgAuth,我们将采用 Entity Framework 来创建一个简单的业务领域模型,非常接近于数据库的设计。接下来利用NBlock框架自带的IRepository泛型接口,来帮助封装抽象化数据访问。
6.1 Entity Framework
Entity Framework是.NET 4.0 的ORM(Object Relational Mapper)部分。Entity Framework提供了一个简单的方式映射数据表到.NET 类。对于我们的OrgAuth 范例程序,我们将映射NB_UserInfo数据表到UserInfo模型类。NB_UserInfo数据表中的列将映射为UserInfo模型类的属性。每一个UserInfo对象将表示NB_UserInfo数据表中的一条单独的数据记录。
说明:NB为NBlock框架的关键字符,在生成模型类的时候,会自动省略。
Entity Framework 避免让我们手动创建SQL 脚本从数据库中检索和更新UserInfo对象。在访问或更新数据库记录时,Entity Framework将负责生成合适的SQL执行逻辑。我们可以使用LINQ 语言写查询表达式,检索UserInfo对象。这样可以大量减少代码行,构建清晰的应用程序。
6.2 增加模型类到Model类库项目中
现在终于可以回到我们的OrgAuth 应用程序了!双击打开OrgAuth.Model类库项目的App.Config文件,如下图所示,修改Entity Framework的连接字符串。
前面我们已经修改了Entity Framework的连接字符串,所以我们这里可以通过在Model.edmx文件中点击 右键 -> 从数据库更新模型 ,在弹出的对话框中,选择需要建模的数据表来创建对象模型。我们这里将NB_UserInfo数据表勾中,点击“完成”按钮并保存Model.edmx文件就可以创建UserInfo对象模型了,如下图所示。
默认情况下,NBlock框架中的设计器在基于数据表创建类时,会通过T4模板自动创建UserInfo类的相关文件,NB_UserInfo.cs、NB_UserInfo_Mapping.cs和修改Model_Context.cs文件。如下图所示。
6.3 OrgAuthRepository泛型类
对于一个小应用程序而言,有时让Conrollers 类直接使用Entity Framework DbContext 类,并将LINQ 查询语句写在Controllers 中。但随着应用程序越来越大,这一方法的维护和扩展将变得麻烦,并且导致重复的LINQ 查询在多个地方出现。让维护和扩展更方便的方法是使用Repository 模式。Repository 类帮助封装数据查询和存储逻辑,从应用程序中抽象隔离具体的数据存储实现。除了是应用程序代码更加简洁外,使用 Repository 模式使将来更改数据库存储实现更加方便。
NBlock框架默认自带了IRepository<T>接口,而利用NBlock框架模板创建的应用系统会自动创建继承于IRepository<T>的类,我们的OrgAuth范例程序就自动创建了IOrgAuthRepository<T>接口和OrgAuthRepository<T>实现类。而IRepository<T>内部已经封装了对DbContext的引用。如下图所示,数据库的增删改查和分页查询等
6.4 使用OrgAuthRepository泛型类实现增删改查操作
现在我们已经创建了OrgAuthRepository类,下面我们看看一些示例代码。
查询代码
下面的代码使用UserCode 检索一条UserInfo 记录:
var userRepository = ServiceLocator.Current.GetInstance<IOrgAuthRepository<UserInfo>>(); // 获取指定UserCode为Admin的用户信息 var user = userRepository.Find(u => u.UserCode == "admin");下面的代码用来检索所有状态为停用的UserInfo集合,并遍历:
// 获取所有状态为停用的用户信息集合 var users = userRepository.FindAll(u => u.AccountState == "停用"); foreach (var user in users) { // TODO 循环处理User的逻辑 }插入和更新代码
下面的代码演示新增2 个UserInfo,新增或更新的信息不会提交到数据库,直到调用Commit () 方法。Entity Framework自动包装所有更新的数据库事务,因此在调用OrgAuthRepository的Save() 方法时,所有的变更都没有更新到数据库中,只有调用了Commit () 方法才会提交。
注意:NBlock框架会在每次请求结束前调用Commit () 方法数据到数据库的,除非我们需要在代码中主动调用Commit ()来及时提交数据到数据库中。
var userRepository = ServiceLocator.Current.GetInstance<IOrgAuthRepository<UserInfo>>(); // 创建第一个用户信息 var user1 = new UserInfo(); user1.UserCode = "NewUser1"; user1.UserName = "新用户1"; user1.AccountState = "正常"; // 创建第二个用户信息 var user2 = new UserInfo(); user2.UserCode = "NewUser2"; user2.UserName = "新用户2"; user2.AccountState = "正常"; // 将用户信息插入到userRepository中,这时在内存数据库中有两个用户信息了。 userRepository.Insert(user1); userRepository.Insert(user2); // 提交两个用户信息到数据库 userRepository.Commit();下面的代码首先检索一个存在的UserInfo 对象,然后更新2个属性,最后调用OrgAuthRepository对象的Commit () 方法,提交更新到数据库。
var userRepository = ServiceLocator.Current.GetInstance<IOrgAuthRepository<UserInfo>>();
// 获取指定Id的用户信息
var user = userRepository.Find("9D707138-C328-4364-A227-A1AEDA1452D7");
// 更新用户的属性
user.UserName = "新管理员";
user.Remark = "用户信息被修改过";
// 提交变更过的用户信息到数据库
userRepository.Commit();
删除操作代码
下面的代码首先调用OrgAuthRepository对象的Delete() 方法,标记该条记录删除。然后再调用OrgAuthRepository对象的Commit () 方法时,从数据库表中删除该记录。
var userRepository = ServiceLocator.Current.GetInstance<IOrgAuthRepository<UserInfo>>(); // 删除指定Id的用户信息 userRepository.Delete("9345CEF2-833A-4F74-8A25-AE38A2E0B86B"); // 提交删除的用户信息到数据库 userRepository.Commit();到这里,我们介绍完如何创建Model对象以及利用Repository模式对Model对象进行简单的数据库增删改查的操作。
下一篇我们会讲解控制器和视图以及用户管理界面的雏形,敬请期待!