实体模型设计
由于是实际开发,而且是时间比较紧的,所以,在开发实现过程中,总有一些对原计划的改动:
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特性值。
总的的数据实体模型类:
数据库实体模型(一)
数据库实体模型(二)
转载请标注原地址:http://www.cnblogs.com/ensleep/tag/%E5%9F%BA%E4%BA%8E.net%20mvc%E7%9A%84%E6%A0%A1%E5%8F%8B%E5%BD%95/