上一篇,大家反應比較熱烈,給了我很大的鼓勵,不管是褒獎的還是貶低的,都是認真看過之后對框架的一個反饋。
由於上一篇沒有說清楚開發環境,導致很多用戶在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對象進行簡單的數據庫增刪改查的操作。
下一篇我們會講解控制器和視圖以及用戶管理界面的雛形,敬請期待!