基于.net mvc的校友录(三、实体模型实现)

实体模型设计

由于是实际开发,而且是时间比较紧的,所以,在开发实现过程中,总有一些对原计划的改动:

 

 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/

posted @ 2013-06-19 19:28  ensleep  阅读(1125)  评论(0编辑  收藏  举报