代码改变世界

ASP.NET MVC 企业级实战 —— 创建用户权限管理范例程序(二)

2012-11-21 14:56  E2Home  阅读(6808)  评论(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六个必填字段的创建信息和修改信息。

clip_image001[6]

说明: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表,这些数据在随后的应用系统开发中会用到,如下图所示。

clip_image002

六、 创建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数据表中的一条单独的数据记录。

说明:NBNBlock框架的关键字符,在生成模型类的时候,会自动省略。

Entity Framework 避免让我们手动创建SQL 脚本从数据库中检索和更新UserInfo对象。在访问或更新数据库记录时,Entity Framework将负责生成合适的SQL执行逻辑。我们可以使用LINQ 语言写查询表达式,检索UserInfo对象。这样可以大量减少代码行,构建清晰的应用程序。

   6.2 增加模型类到Model类库项目中

现在终于可以回到我们的OrgAuth 应用程序了!双击打开OrgAuth.Model类库项目的App.Config文件,如下图所示,修改Entity Framework的连接字符串。

clip_image002[5]

前面我们已经修改了Entity Framework的连接字符串,所以我们这里可以通过在Model.edmx文件中点击 右键 -> 从数据库更新模型 ,在弹出的对话框中,选择需要建模的数据表来创建对象模型。我们这里将NB_UserInfo数据表勾中,点击“完成”按钮并保存Model.edmx文件就可以创建UserInfo对象模型了,如下图所示。

clip_image002[7]

默认情况下,NBlock框架中的设计器在基于数据表创建类时,会通过T4模板自动创建UserInfo类的相关文件,NB_UserInfo.cs、NB_UserInfo_Mapping.cs和修改Model_Context.cs文件。如下图所示。

clip_image002[9]

   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的引用。如下图所示,数据库的增删改查和分页查询等

clip_image002[11]

   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对象进行简单的数据库增删改查的操作。

下一篇我们会讲解控制器和视图以及用户管理界面的雏形,敬请期待!

代码下载:/Files/lfzx_1227/OrgAuth.rar