• Entity Framework Code First (三)Data Annotations


    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 来明确属性间的指向

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

  • 相关阅读:
    正则表达式记录
    XMLHttpRequest(Ajax)不能设置自定义的Referer
    删除右键菜单上的Adobe Drive CS4,Win7上也没有问题
    A HOWTO on Optimizing PHP(如何优化PHP的一篇文章)
    PHP XML To Array,将XML转换为数组
    让图片在高度确定的块元素中垂直居中
    (转)2011年,還是微軟IE的天下~網頁設計師哭泣吧!
    产生类似GUID的唯一ID
    转:编写跨浏览器兼容的 CSS 代码的金科玉律
    array_intersect 比 array_diff 快
  • 原文地址:https://www.cnblogs.com/sjqq/p/7050937.html
Copyright © 2020-2023  润新知