一. 简介
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 Student42 {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 : DbContext2 {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更多用法,详解下一个章节。