ASP.NET MVC 企業級實戰 —— 創建用戶權限管理范例程序(二)


上一篇,大家反應比較熱烈,給了我很大的鼓勵,不管是褒獎的還是貶低的,都是認真看過之后對框架的一個反饋。

由於上一篇沒有說清楚開發環境,導致很多用戶在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM