Data annotation特性是在.NET 3.5中引进的,给ASP.NET web应用中的类提供了一种添加验证的方式。Code First允许你使用代码来建立实体框架模型,同时允许用Data annotation特性来配置类和属性的某些特性。

其实在前面的几篇文章中,有用到几个,在这一篇里,进行一次比较全面的介绍

Key

EF框架要求每个实体必须有主键字段,他需要根据这个主键字段跟踪实体。CodeFirst方法在创建实体时,也必须指定主键字段,默认情况下属性被命名为ID、id或者[ClassName]Id,将映射为数据表中的主键如果没有类似的命名,并且也未显示指明主键,则生成失败,引发异常。如果想要自定义主键列名,则可以使用Key注释

 [Key]
public int MyId { get; set; }

Required

当要求数据库在字段,不能为空时

[Required]
public string BookTitle { get; set; }

MaxLength 、MinLength

设置数据库字段的长度范围

   [MaxLength(10),MinLength(6)]
public string Password { get; set; }

NotMapped

当创建数据表时,用此属性修饰的属性,不会被创建为数据表字段

    [NotMapped]
public int MyProperty { get; set; }

ComplexType

Complex属性是将一个对象做为另一个对象的属性。映射到数据库中则子对象表现为多个属性字段。具体可参考:EF框架step by step(6)—处理实体complex属性

    [ComplexType]
public class Publisher
{
public string PublisherName { get; set; }
public string PublisherAddress { get; set; }
} 

ConcurrencyCheck

并发检查允许你标识一个或者多个属性在实体更新时,要进行检查是否与原实体一致。并发检查依懒于OriginalValue,在WEB应用程序中,通常是某一用户获取数据实体后,会与数据库断开连接,这时,如果另一用户也获得了实体并进行了更新新操作,那么当最初用户进行再更新时,会自动进行并发检查,根据被标识ConcurrencyCheck属性的OriginalValue,判断原实体是否存在。如果不存在,则在SaveChanges方法是会引发一个异常。

下面的例子是Book实体的BookTitle属性被标识为ConcurrencyCheck。

    [Required,ConcurrencyCheck]
public string BookTitle { get; set; }

则下面代码模拟并发现象:

        Book book = db.Books.Find(1);
//显示表明数据实体被修改
db.Entry(book).State = System.Data.EntityState.Modified;
db.Entry(book).Property(b => b.BookTitle).OriginalValue = "DataAnnotations"; //这么代码会引发异常
db.SaveChanges();

引发异常如下图:

用SQL Profile监控,数据库执行了如下

update [dbo].[MyBook]
set [BookTitle] = @0
where (([MyId] = @1) and ([BookTitle] = @2))
', N'@0 nvarchar(4000),@1 int,@2 nvarchar(4000)',
@0 = N'EF4.1 Code First', @1 = 1, @2 = N'DataAnnotations'

TimeStamp 与 DatabaseGenerated

TimeStamp是比ConcurrencyCheck更通用的监控并发的字段,在实体中通常一个类型为字节数组的字段表示,一个实体类只能有一个TimeStamp字段,并且他通常与DatabaseGenerated联合使用,DatabaseGenerated表明是由数据库自动生成,他需要DatabaseGeneratedOption枚举来做为数据库生成时参数,DatabaseGeneratedOption枚举包含三个值 Computed 由数据库自动计算,Identity自动增长,None数据库不做处理。

        [Timestamp,DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public Byte[] TimeStamp { get; set; }

TimeStamp与ConcurrencyCheck用法类似

        Book book = db.Books.Find(1);

        //模拟另一个用户对同一数据实体进行更新
db.Database.ExecuteSqlCommand("update mybook set Booktitle='EF' where MyId=1"); book.BookTitle = "New Title";
db.SaveChanges();

同样,在SaveChanges()时,也会引发DbUpdateConcurrencyException。

Table

CodeFirst 方法默认以实体类名复数形式做为数据表名,Table注释允许自定义表名

    [Table("MyBook")]
public class Book

Column

CodeFirst 方法默认以实体类属性名做为列名,Column注释允许自定列名及数据类型

   [Column("BlogDescription", TypeName = "ntext")]
public string Description { get; set; }

好,来个综合示例,看一下运行结果,对照理解一下

    [Table("MyBook")]
public class Book
{
[Key]
public int MyId { get; set; } [MaxLength(10), MinLength(6)]
public string KeyWord { get; set; } [Required,MaxLength(50)]
public string BookTitle { get; set; } [NotMapped]
public int MyProperty { get; set; } public Publisher Publisher { get; set; } [Column("BlogDescription", TypeName = "ntext")]
public string Description { get; set; } [Timestamp,DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public Byte[] TimeStamp { get; set; } }
[ComplexType]
public class Publisher
{
public string PublisherName { get; set; }
public string PublisherAddress { get; set; }
}

EF框架step by step(7)—Code First DataAnnotations(1)的更多相关文章

  1. EF框架step by step(7)—Code First DataAnnotations(2)

    上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...

  2. EF框架step by step(8)—Code First DataAnnotations(2)

    上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...

  3. EF框架step by step(6)—处理实体complex属性

    上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理 这一篇介绍一下Code First方法中,实体Complex属性的处理.Complex属性是将一个对象做为另一个对象的属性.映射到数据库中 ...

  4. EF框架step by step(5)—处理实体简单属性

    EF框架会对实体进行跟踪,对实体的每个属性当前值和原始值及其状态进行跟踪,记录.当前值是指实体属性当前的被赋予的值,而原始值是指实体最初从数据库读取或者附加到DbContext时的值. 先通过简单的代 ...

  5. EF框架step by step(3)—Code-First

    CodeFirst是EF框架的第三种方式,也是最为复杂一种方式,本文将以EF4.1版本为基础,简要讲解一下用法,同时,也介绍DbContext的用法. 本文采用的示例仍然是前两篇采用的博客用户的示例. ...

  6. EF框架step by step(2)—Model-First

    这一篇主要说一下EF框架中,Model First做法,仍然采用上一篇的案例.但增加评论功能.首先打开Blog.edmx文件,在空白处右键,添加新实体Comment,如下图示: 点击确定,关闭窗口. ...

  7. WPF Step By Step 系列-Prism框架在项目中使用

    WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...

  8. Code Understanding Step by Step - We Need a Task

      Code understanding is a task we are always doing, though we are not even aware that we're doing it ...

  9. enode框架step by step之消息队列的设计思路

    enode框架step by step之消息队列的设计思路 enode框架系列step by step文章系列索引: enode框架step by step之开篇 enode框架step by ste ...

随机推荐

  1. pmap

    .[root@localhost security]# pmap -d : -bash Address Kbytes Mode Offset Device Mapping r-x-- : bash b ...

  2. WebKit示例解读

    如果你曾经在你的App中使用UIWebView加载网页内容的话,你应该体会到了它的诸多不尽人意之处.UIWebView是基于移动版的Safari的,所以它的性能表现十分有限.特别是在对几乎每个Web应 ...

  3. React Native实例之房产搜索APP

    React Native 开发越来越火了,web app也是未来的潮流, 现在react native已经可以完成一些最基本的功能. 通过开发一些简单的应用, 可以更加熟练的掌握 RN 的知识. 在学 ...

  4. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  5. 三、jQuery--Ajax基础--Ajax全接触--JSON

    JSON基本概念 JSON:JavaScript对象表示法(JavaScript Object Notation) JSON是存储和交换文本信息的语法,类似XML.它采用键值对的方式来组织,易于人们阅 ...

  6. JS window.open()属性

    一. Window 对象 Window 对象是 JavaScript 层级中的顶层对象. Window 对象代表一个浏览器窗口或一个框架. Window 对象会在 <body> 或 < ...

  7. mysql里表以及列的增删改查

    在一个表里插入数据(增)   insert into 表名 (需要插入的列名如  id,name,age)values    (1,'张三',20), (2,'李四',30):     查询表内容(查 ...

  8. AJAX 搜索自动显示练习

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. VC++6.0使用OpenGL前的配置(必看)

    要在VC++6.0中使用opengl,需要配置一下环境设置. 具体需要两步: 1.加入一个头文件,两个lib文件,两个dll文件,放在合适位置. 2.配置一下vc++6.0的Project Setti ...

  10. 获取当前IP地址,跳转到对应城市网站。

    index.php文件 1,通过获取当前IP地址, 2,调用新浪AIP,获取到当前城市. 3,将中文转换为拼音后跳转. <?php include './pinyin.php'; //获取当前i ...