zoukankan      html  css  js  c++  java
  • 基于.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/

  • 相关阅读:
    (C/C++学习)6.数组指针和指针数组
    (C/C++学习)5.C++中的虚继承-虚函数-多态解析
    (C/C++学习)4.C++类中的虚函数表Virtual Table
    (C/C++学习)3.C++中cin的成员函数(cin.get();cin.getine()……)
    (C/C++学习)2.C语言中文件流操作基本函数总结
    关于for,while与do while
    计算机算法-C语言-统计字母数字个数解
    计算书费
    Truncate table
    sqlserver 在脚本中,为所有字符前没有N标记的字符增加N
  • 原文地址:https://www.cnblogs.com/ensleep/p/3144746.html
Copyright © 2011-2022 走看看