您的位置:首页 > 其它

Entity Framework Code First (三)Data Annotations

2016-08-30 10:17 423 查看
  Entity Framework Code First 利用一种被称为约定(Conventions)优于配置(Configuration)的编程模式允许你使用自己的 domain classes 来表示 EF 所依赖的模型去执行查询、更改追踪、以及更新功能,这意味着你的 domain classes 必须遵循 EF 所使用的约定。然而,如果你的 domain classes 不能遵循 EF 所使用的约定,此时你就需要有能力去增加一些配置使得你的 classes 能够满足 EF 所需要的信息。

  Code First 提供了两种方式来配置你的类:

DataAnnotations, 使用简单属性;

Fluent API, 以编程命令行式的方式来描述你的配置

  本文将关注 DataAnnotations(位于命名空间 System.ComponentModel.DataAnnotations)

  为了便于示例,我们先创建两个类:Blog 和 Post



  以上类都是遵循约定的,但是你也可以使用 annotations 为 EF 提供更多的信息

Key主键

  EF 依赖于每一个实体都有一个主键从而能够追踪实体。 在约定下,主键是通过寻找名称为 ID 或 ClassName + ID 的属性确定。那么如果类中没有此类的属性呢?我们把类改造如下(把 Id 改为 PrimaryTrackingKey)



  此时如果我们添加 Scaffolded 会出现如下错误



  我们需要使用 key annotation 确定哪一个属性是主键



  我们使用 Code First's Database Generation 功能看看数据库的情况



Required非空

  用于指示字段非空



  运行看一下结果



  我们在看一下后台数据库情况



MaxLength and MinLength长度限制

  顾名思义,就是限制字段的长度



  看一下后台数据库



  运行看结果



NotMapped忽略

  类中有些属性,如通过计算获得或其它列的合并而来的,我们并不希望其记录在数据库中,此时就可以使用 NotMapped Annotation



  对于类也是一样的



ComplexType复杂类型

  一般这种情况是不常见的:类中包含另一个类即一个完整的实体是由一系列类的集合来描述。例如我们在我们的模型中增加一个叫 BlogDetails 的类



  注意 BlogDetails 不包含任何主键属性, 在领域驱动设计中被称为值对象,而在 EF 中则被称为复杂类型(ComplexType). Complex Types 是无法自我追踪的,但是我们可以通过 ComplexType Annotation 来改变这种尴尬



  可以看到,在数据库中表 Blog 包含 BlogDetails 的所有两个属性,默认列名前缀为 complex type 即 BlogDetails

ConcurrencyCheck并发检查

  ConcurrencyCheck Annotation 允许你可以在一个或多个属性上设置一个标记用于当用户更新或删除实体时做并发检查。



  如果此时同时对此列进行更新,则会抛出异常 DbUpdateConcurrencyException

TimeStamp时间戳

  通常用行版本号或时间戳来检查并发,除了使用 ConcurrencyCheck Annotation, 还可以使用更为精确的 TimsStamp, 前提是这个属性的类型是字节数组(byte array). Code First 在对待 TimsStamp 属性和 ConcurrencyCheck 属性是一样的,只不过能确保数据库中生成的字段是 non-nullable

  在一个给定的类中只能有一个 TimsStamp 属性



  看一下后台数据库



Table and Column表/列名

  指定匹配到数据库的表/列名



  可以看到表/列名已更改

DatabaseGenerated自增长

  


  DatabaseGeneratedOption 有三个选项:

DatabaseGeneratedOption.Computed: 在用 Code First 生成数据库的时候你可以在 byte 或 timestamp 列上使用 DatabaseGenerated Annotation,否则就应该在数据库存在的情况下使用因为如果数据库不存在,此时 Code First 不知道为计算列(Computed Column)选择使用什么样的公式

DatabaseGeneratedOption.Identity: 如果主键为 integer 型,则数据库默认为自增长(效果等同于设置DatabaseGeneratedOption.Identity), 如果主键是 GUID 类型,则要显式设置自增长

DatabaseGeneratedOption.None: 如果不想自增长,可设置成 DatabaseGeneratedOption.None

ForeignKey 外键

  


  看看数据库



InverseProperty属性反转

  InverseProperty 一般使用在当类间有多重关系的时候。

  例如在 Post 中你可能不仅需要追踪谁写的也还要追踪有谁编辑了博客





  此时你会看到后台数据库有四个外键 Person_Id, Person_Id1, CreatedBy_Id and UpdatedBy_Id



  为了解决这个问题,我们可以使用 InverseProperty annotation 来明确属性间的指向



  再一次看看数据库,情况已经发生了变化



  原文链接:http://msdn.microsoft.com/en-us/data/jj591583
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: