由於是實際開發,而且是時間比較緊的,所以,在開發實現過程中,總有一些對原計劃的改動:

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特性值。
總的的數據實體模型類:

數據庫實體模型(一)

數據庫實體模型(二)