码迷,mamicode.com
首页 > 其他好文 > 详细

EntityFramework Code-First 简易教程(六)-------领域类配置之DataAnnotations

时间:2016-05-20 00:43:21      阅读:811      评论:0      收藏:0      [点我收藏+]

标签:

EF Code-First提供了一个可以用在领域类或其属性上的DataAnnotation特性集合,DataAnnotation特性会覆盖默认的EF约定。

DataAnnotation存在于两个命名空间里:

System.ComponentModel.DataAnnotationsSystem.ComponentModel.DataAnnotations.Schema

注意: DataAnnotations只提供了一部分的配置选项,全部的配置选项在Fluent API中。

 

System.ComponentModel.DataAnnotations 包含的特性:

Attribute描述
Key 标记一个属性,其将会在关系表中被映射成主键
Timestamp 标记一个属性,其将会在数据库中被映射成一个不为null的tiamestamp(时间戳)列
ConcurrencyCheck 这个属性允许你标记一个或多个属性,被标记的属性将会在用户编辑或删除entity的时候进行并发检查
Required 强制约束,该属性必须有数据,不能为null(同样适用MVC)
MinLength 确保数组或字符串长度达到最小长度
MaxLength 数据库中列的长度的最大值
StringLength 在数据字段中指定字符允许的最大长度和最小长度

System.ComponentModel.DataAnnotations.Schema 包含的特性:

Attribute描述
Table 指定被映射的类在数据库生成的表名
Column 指定被映射的属性在表中的列名和数据类型
Index 在指定列上创建索引(仅EF6.1以上版本支持)
ForeignKey 给导航属性指定外键属性
NotMapped 标记的属性不会被映射到数据库
DatabaseGenerated 指定的属性将会映射成数据库表中的计算列,所以这个属性应是只读的。也可以用在把属性映射成标识列(自增长列)
InverseProperty 当两个类之间包含多重关系的时候,默认约定会排列组合他们的导航属性组合并一一创建外键,InverseProperty可以标记实际的主外键关系,从而过滤掉因排列组合出来的无用外键
ComplexType 标记一个类为复杂类型

 


 

下面我们来详细介绍各个特性:

Key:

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:

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(时间戳)

 

ConcurrencyCheck:

当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 NUPDATE [dbo].[Students]
SET [StudentName] = @0
WHERE (([StudentId] = @1) AND ([StudentName] = @2))
,N@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ,@0=NSteve,@1=1,@2=NBill
go            
       

注意:TimeStamp特性只能用在single byte数组属性上,然而ConcurrencyCheck特性可以用在任何数量和任何数据类型的属性上。

 

先睡了,后面的放假再写。。。

 

EntityFramework Code-First 简易教程(六)-------领域类配置之DataAnnotations

标签:

原文地址:http://www.cnblogs.com/tang-tang/p/5510574.html

(1)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!