第十五节: 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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

 

posted @ 2017-11-10 09:58  Yaopengfei  阅读(1484)  评论(0编辑  收藏  举报