EF框架step by step(7)—Code First DataAnnotations(1)
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)的更多相关文章
- EF框架step by step(7)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
- EF框架step by step(8)—Code First DataAnnotations(2)
上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体 ...
- EF框架step by step(6)—处理实体complex属性
上一篇的中介绍过了对于EF4.1框架中,实体的简单属性的处理 这一篇介绍一下Code First方法中,实体Complex属性的处理.Complex属性是将一个对象做为另一个对象的属性.映射到数据库中 ...
- EF框架step by step(5)—处理实体简单属性
EF框架会对实体进行跟踪,对实体的每个属性当前值和原始值及其状态进行跟踪,记录.当前值是指实体属性当前的被赋予的值,而原始值是指实体最初从数据库读取或者附加到DbContext时的值. 先通过简单的代 ...
- EF框架step by step(3)—Code-First
CodeFirst是EF框架的第三种方式,也是最为复杂一种方式,本文将以EF4.1版本为基础,简要讲解一下用法,同时,也介绍DbContext的用法. 本文采用的示例仍然是前两篇采用的博客用户的示例. ...
- EF框架step by step(2)—Model-First
这一篇主要说一下EF框架中,Model First做法,仍然采用上一篇的案例.但增加评论功能.首先打开Blog.edmx文件,在空白处右键,添加新实体Comment,如下图示: 点击确定,关闭窗口. ...
- WPF Step By Step 系列-Prism框架在项目中使用
WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...
- 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 ...
- enode框架step by step之消息队列的设计思路
enode框架step by step之消息队列的设计思路 enode框架系列step by step文章系列索引: enode框架step by step之开篇 enode框架step by ste ...
随机推荐
- 字典树(codevs 4189)
4189 字典 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 最经,skyzhong得到了 ...
- 大数计算_BigNum优化_加减乘除乘方取余_带注释_数组
#include <iostream> #include <algorithm> #include <cstring> #include <cstdlib&g ...
- MVC控制下输出图片、javascript与json格式
/// <summary> /// 输出图片 /// </summary> /// <returns></returns> public ActionR ...
- Android WebView 拦截自定义协议
URL 语法 URL由三部分组成:资源类型.存放资源的主机域名.资源文件名. URL的一般语法格式为: (带方括号[]的为可选项): protocol :// hostname[:port] / pa ...
- iOS中的两种主要架构及其优缺点浅析
凡是程序的开发者,应该对程序的架构都不陌生.一个程序的架构的好坏对这个程序有着非常重要的作用.今天我们来看一下iOS开发中用要的两种主流的程序架构.这个过程中我们主要以例子的形式展开. 我们来看第一种 ...
- EMS-Demo 雇员管理系统演示
做了一个小小的雇员管理系统,主要使用了JTable,然后比较得意的地方是实现了拼音搜索,感觉很高大上其实只要引入一个Jpinyin.jar就可以了(网上到处都有下载或者去我的git项目的lib中下载) ...
- 20145206《Java程序设计》实验五Java网络编程及安全
20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...
- java07课堂作业
一.动手动脑:多层的异常捕获-1 阅读以下代码(CatchWho.java),写出程序运行结果: public class CatchWho { public static void main(Str ...
- 数据结构和算法 – 8.链表
8.1.数组存在的问题 在处理列表的时候数组是常用的数据结构.数组可以对所存储的数据项提供快速地存取访问,而且它很易于进行循环遍历操作.当然,数组已经是语言的一部分了,用户不需要使用额外的内存,也不需 ...
- MySQL 主从同步
http://blog.csdn.net/z69183787/article/details/53897894