由於是實際開發,而且是時間比較緊的,所以,在開發實現過程中,總有一些對原計劃的改動:
AlumniBookModel數據庫實體模型
這是主數據實體類,EF會根據此實體生成數據庫,它的每一個成員都是DbSet類型,這是數據集類型,也就是內存中的表,數據庫AlumniBookModel中共有九張表,它們的名字分別是成員的名字,但是,若是打開數據庫,就會發現,它們的表名是這些成員名的復數,而這個機制,開篇已經有講過,這裡不再多說。再來看一下它的構造函數:
public class AlumniBookModel : DbContext { public AlumniBookModel() : base("ABConnection") { } public DbSet<Admin> Admin { get; set; } public DbSet<User> User { get; set; } public DbSet<UserInfo> UserInfo { get; set; } public DbSet<Class> Class { get; set; } public DbSet<School> School { get; set; } AlumniBookModel繼承了DbContext,也就是數據庫上下文類,這個類就想當一個數據庫類型,它對不同的數據進行了封裝,構造方法中傳進去參數ABConnection是web.config中 <connectionStrings> <add name="ABConnection" connectionString="Data Source=|DataDirectory|AlumniBook.sdf" providerName="System.Data.SqlServerCe.4.0" /> </connectionStrings>
connectionString數據庫連接字符串,數據庫會根據它在合適的時候創建數據庫,具體細節,我在介紹EF的時候已經說過了,這裡不在詳細說。
下面介紹一個普通數據實體模型類(表)--UserInfo
UserName實體模型圖
這個類中,它的每一個屬性都是表的列,其中DateTime的類型是可為空的DateTime類型,是C#新添加的類型,目的是解決時間為null的異常問題。UserInfo裡面包含了用戶的個人資料,但是不包含用戶的密碼,用戶的密碼放在User裡面,因為密碼驗證的時候,總是要取密碼,因此將它放到特定的實體(相當於其它系統中的表,這裡再說成表的話,可能不是太科學)裡面了。凡是寫為DbContext子類的成員屬性的實體類,都是表,也都是數據模型,除此之外,其它的實體模型都是視圖模型,用來作為前後台交互數據的對象用的。
比如下面的這個注冊視圖模型:
ReginModel實體模型圖
視圖模型與數據模型有所不同,因為,數據模型是與用戶直接接觸的,而且多數時候還會返回數據,所以要多一項驗證,對於本系統的注冊視圖模型源代碼是這樣的:
public class ReginModel { [Required] [MinLength(3), MaxLength(10)] [Display(Name = "用戶名")] public string UserName { get; set; } [Required] [Display(Name = "昵稱")] [DataType(DataType.Text)] [StringLength(20, ErrorMessage = "昵稱的長度應在3到20之間", MinimumLength = 3)] public string NickName { get; set; } [Required] [StringLength(100, ErrorMessage = "{0} 必須至少包含 {2} 個字符。", MinimumLength = 6)] [DataType(DataType.Password)] [Display(Name = "新密碼")] public string Password { get; set; } [DataType(DataType.Password)] [Display(Name = "確認新密碼")] [Compare("NewPassword", ErrorMessage = "新密碼和確認密碼不匹配。")] public string CPassword { get; set; } [Display(Name = "生日")] [DataType(DataType.DateTime, ErrorMessage = "請填寫正確的日期格式")] public DateTime Birthday { get; set; } [Display(Name = "性別")] [Required] public bool Sex { get; set; } [Display(Name = "郵箱地址")] [DataType(DataType.EmailAddress,ErrorMessage="此處必須是郵箱")] [Required] public string email { get; set; } }
EF充分使用了C#語言的特性,使用屬性來作為字段控制。比如第一個成員UserName,Required的意思是這個成員是必須,不能為null,MinLenth(3)則表示最小長度為3,不能比3再小,當然,它只限於對字符串類型以及數字類型的驗證。Display這個特性,是給UserName這個屬性又加上的一個屬性,可以通過前台Razor中的代碼看一下。
<legend>注冊表單</legend> <table> <tr> <td>@Html.LabelFor(m=>m.UserName)</td> <td>@Html.TextBoxFor(m => m.UserName)</td> </tr>
查看本欄目
可以看見這裡沒有使用常規的<input>標簽,但其實是使用的,只是@html.TextBoxFor幫我們生成了,它會以本頁的強類型的UserName作為數據元來生成<input>也就是說,當這個form提交給後台之後,這個input裡面的數據將會被自動封裝在UserName屬性中。而上面的LabelFor則是將UserName這個屬性的Display中的Name屬性作為label顯示出來,正好就是我們上面的UserName屬性的Display特性值。
總的的數據實體模型類:
數據庫實體模型(一)
數據庫實體模型(二)