标签:
EF Code-First提供了一个可以用在领域类或其属性上的DataAnnotation特性集合,DataAnnotation特性会覆盖默认的EF约定。
DataAnnotation存在于两个命名空间里:
System.ComponentModel.DataAnnotations和System.ComponentModel.DataAnnotations.Schema
注意: DataAnnotations只提供了一部分的配置选项,全部的配置选项在Fluent API中。
Attribute | 描述 |
---|---|
Key | 标记一个属性,其将会在关系表中被映射成主键 |
Timestamp | 标记一个属性,其将会在数据库中被映射成一个不为null的tiamestamp(时间戳)列 |
ConcurrencyCheck | 这个属性允许你标记一个或多个属性,被标记的属性将会在用户编辑或删除entity的时候进行并发检查 |
Required | 强制约束,该属性必须有数据,不能为null(同样适用MVC) |
MinLength | 确保数组或字符串长度达到最小长度 |
MaxLength | 数据库中列的长度的最大值 |
StringLength | 在数据字段中指定字符允许的最大长度和最小长度 |
Attribute | 描述 |
---|---|
Table | 指定被映射的类在数据库生成的表名 |
Column | 指定被映射的属性在表中的列名和数据类型 |
Index | 在指定列上创建索引(仅EF6.1以上版本支持) |
ForeignKey | 给导航属性指定外键属性 |
NotMapped | 标记的属性不会被映射到数据库 |
DatabaseGenerated | 指定的属性将会映射成数据库表中的计算列,所以这个属性应是只读的。也可以用在把属性映射成标识列(自增长列) |
InverseProperty | 当两个类之间包含多重关系的时候,默认约定会排列组合他们的导航属性组合并一一创建外键,InverseProperty可以标记实际的主外键关系,从而过滤掉因排列组合出来的无用外键 |
ComplexType | 标记一个类为复杂类型 |
Key特性应用在一个类的属性上。Code-First默认约定将名称是"Id"或者{类名}+"Id"的属性创建为一个主键列,Key特性覆写了默认约定,我们可以把任何想要成为的主键的属性标记为Key而不管它是什么名称。
代码如下:
using System.ComponentModel.DataAnnotations; public class Student { public Student() { } [Key] public int StudentKey { get; set; } public string StudentName { get; set; } }
数据库中,Students表中的StudentKey列被创建成了主键
我们也可以用用Key特性和Column特性创建混合主键,如下代码所示:
using System.ComponentModel.DataAnnotations; public class Student { public Student() { } [Key] [Column(Order=1)] public int StudentKey1 { get; set; } [Key] [Column(Order=2)] public int StudentKey2 { get; set; } public string StudentName { get; set; } }
根据上面的代码,在Students表中,创建出了混合主键StudentKey1和StudentKey2
注意: 当Key特性应用在单整型类型的属性上时,会将其创建为一个标识列,而混合键无论它是不是整型类型,都不会创建标识列。Key特性除了无符号整型(unsinged integers),可以应用在如string、datatime、decimal等任何数据类型上。
TimeStamp特性只能用在数据类型为byte array的属性上,TimeStamp特性会在数据库表中创建一个timestamp属性的列,Code-First自动使用TimeStamp列进行并发检查。
(关于并发检查,可以参考Gyoung的笔记:Entity Framework 并发处理)
代码如下:
using System.ComponentModel.DataAnnotations; public class Student { public Student() { } public int StudentKey { get; set; } public string StudentName { get; set; } [TimeStamp] public byte[] RowVersion { get; set; } }
再次强调,标记TimeStamp特性的属性类型必须是byte数组。
这样,在数据库Students表中就把RowVersion列创建成了timestamp(时间戳)
当EF对表执行update命令时,Code-First会把标记了ConcurrencyCheck特性的列中的值插入到SQL语句的“where”子句中来进行并发检查。如下代码:
using System.ComponentModel.DataAnnotations; public class Student { public Student() { } public int StudentId { get; set; } [ConcurrencyCheck] public string StudentName { get; set; } }
如上所示,StudentName属性上标记了ConcurrencyCheck特性,所以Code-First会在update命令中把StudentName列包含进去以进行乐观并发检查(有关乐观并发和悲观并发,上面Gyoung的笔记有介绍,这里就不多讨论)。如下代码所示:
exec sp_executesql N‘UPDATE [dbo].[Students] SET [StudentName] = @0 WHERE (([StudentId] = @1) AND ([StudentName] = @2)) ‘,N‘@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ‘,@0=N‘Steve‘,@1=1,@2=N‘Bill‘ go
注意:TimeStamp特性只能用在single byte数组属性上,然而ConcurrencyCheck特性可以用在任何数量和任何数据类型的属性上。
先睡了,后面的放假再写。。。
EntityFramework Code-First 简易教程(六)-------领域类配置之DataAnnotations
标签:
原文地址:http://www.cnblogs.com/tang-tang/p/5510574.html