zoukankan      html  css  js  c++  java
  • 第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定

    一. 简介

    1. DataAnnotations说明:EF提供以特性的方式添加到 domain classes上,其中包括两类:

       A:System.ComponentModel.DataAnnotations命名空间下的特性是表中列的属性的。

        包括:Key、Required、MinLength和MaxLength、StringLength、Timestamp、ConcurrencyCheck。

      B:System.ComponentModel.DataAnnotations.Schema命名空间下的特性是控制数据库结构的。

        包括:Table、Column、ForeignKey、NotMapped。

    2. 特性介绍

     ① Key :声明主键

     ② Required:非空声明

     ③ MinLength和MaxLength:设置string类型的最大长度和最小长度,数据库的对应nvarchar

     ④ StringLength:设置string类型的长度,数据库对应nvarchar

     ⑤ Timestamp:将byte[]类型设置为timestamp类型

     ⑥ ConcurrencyCheck:并发检查,执行update操作时,会检查并发性(乐观锁)

     ⑦ Table: 给代码中的类换一个名来映射数据库中的表名.(还可以设置表的架构名称  [Table("myAddress", Schema = "Admin")]   

     ⑧ Column: 给代码中类的属性换一个名来映射数据库中表的列名. (还可以设置列的类型、列在表中的显示顺序    [Column("myAddressName2", Order = 1, TypeName = "varchar")])

     ⑨ ForeignKey:设置外键,特别注意里面的参数填写什么.

     ⑩ NotMapped: 类中的列名不在数据库表中映射生成. (还可以只设置get属性或者只设置set属性,在数据库中也不映射)

       另外还有:Index、InverseProperty、DatabaseGenerated、ComplexType 这四个都不常用,在这里就不多介绍了

      (详细可以看:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx)

    二. 代码实战

     1  public class Student4
     2     {
     3        [Key] //主键声明
     4         public string studentKey { get; set; }
     5 
     6        [Required] //非空声明
     7        public string stuName { get; set; }
     8 
     9        [MaxLength(10)]  //最大长度
    10        public string stuTxt1 { get; set; }
    11 
    12        [MaxLength(10), MinLength(2)]  //最大长度和最小长度
    13        public string stuTxt2 { get; set; }
    14 
    15        [Timestamp] //设置为时间戳
    16        public byte[] rowVersion { get; set; }
    17 
    18        [ConcurrencyCheck] //并发检查
    19        public string stuTxt3 { get; set; }
    20 
    21 
    22 
    23        public virtual StudentAddress4 stuAddress4 { get; set; }
    24     }
    25 
    26 
    27      [Table("myAddress")]  //设置类映射的数据库表名
    28     //[Table("myAddress", Schema = "Admin")]  //设置类映射的数据库表名和架构名
    29     public class StudentAddress4
    30     {
    31         [ForeignKey("stu")]  //设置外键(对应下面声明的 stu)    //这里符合 类名+id(忽略大小写)的规则,所以自动生成主键
    32         public string studentAddress4Id { get; set; }
    33         
    34         [Column("myAddressName")] //设置映射数据库中表的列名
    35         public string stuAddressName { get; set; }
    36 
    37         [Column("myAddressName2", Order = 1, TypeName = "varchar")] //设置映射数据库中表的列名、顺序、类型
    38         public string stuAddrssName2 { get; set; }
    39 
    40         [NotMapped]//不映射数据
    41         public string addressNum { get; set; }
    42 
    43         //不映射数据
    44         public string txt1 { get { return stuAddrssName2;} }
    45 
    46         //不映射数据
    47         public string _txt2 = "1";
    48         public string txt2 { set { _txt2 = value; } }
    49 
    50         public virtual Student4 stu { get; set; }
    51 
    52     }
     1   public class dbContext4 : DbContext
     2     {
     3         public dbContext4()
     4             : base("name=dbContext4")
     5         {
     6 
     7         }
     8         public DbSet<Student4> Student4 { get; set; }
     9 
    10         public DbSet<StudentAddress4> StudentAddress4 { get; set; }
    11 
    12 
    13         protected override void OnModelCreating(DbModelBuilder modelBuilder)
    14         {
    15             base.OnModelCreating(modelBuilder);
    16         }
    17     }
    1    <!--正宗的CodeFirst DataAnnotation-->
    2     <add name="dbContext4" connectionString="data source=localhost;initial catalog=CodeFirstDB4;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
    3    

    三. 总结

       DataAnnotations通过注解形式改变数据库结构,非常灵活,当然EF还提供另外一种方式 Fluent API的形式,可以将一个类映射成多个数据库表,还可以将配置写成多个文件,方便控制。

       关于Fluent API更多用法,详解下一个章节。

    !

    • 作       者 : Yaopengfei(姚鹏飞)
    • 博客地址 : http://www.cnblogs.com/yaopengfei/
    • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    常用地市
    UML 类图总结
    什么是线程和进程
    一切皆是对象
    反射、Attribute
    js 面试题
    委托
    使用NPOI导出Excel引发异常(IsReadOnly = “book.IsReadOnly”引发了类型“System.NotImplementedException”的异常)
    lambda表达式封装对数据库的查询
    lambda表达式Expression<Func<Person, bool>> 、Func<Person, bool>区别
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/7813120.html
Copyright © 2011-2022 走看看