EF Code First DataAnnotations
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 Code First DataAnnotations的更多相关文章
- 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 Code First学习系列
EF Model First在实际工作中基本用不到,前段时间学了一下,大概的了解一下.现在开始学习Code First这种方式.这也是在实际工作中用到最多的方式. 下面先给出一些目录: 1.什么是Co ...
- 1.什么是Code First(EF Code First 系列)
EF4.1中开始支持Code First .这种方式在领域设计模式中非常有用.使用Code First模式,你可以专注于领域设计,根据需要,为你一个领域的对象创建类集合,而不是首先来设计数据库,然后来 ...
- MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- EF Code First一对一、一对多、多对多关联关系配置
1.EF Code First一对一关联关系 项目结构图: 实体类: Account.cs using System; using System.Collections.Generic; using ...
- Inheritance with EF Code First: Part 3 – Table per Concrete Type (TPC)
Inheritance with EF Code First: Part 3 – Table per Concrete Type (TPC) This is the third (and last) ...
- Inheritance with EF Code First: Part 2 – Table per Type (TPT)
In the previous blog post you saw that there are three different approaches to representing an inher ...
- MVC5中Model层开发数据注解 EF Code First Migrations数据库迁移 C# 常用对象的的修饰符 C# 静态构造函数 MSSQL2005数据库自动备份问题(到同一个局域网上的另一台电脑上) MVC 的HTTP请求
MVC5中Model层开发数据注解 ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证( ...
随机推荐
- 送给使用phpstorm+thinkphp开发者的福利
送给使用phpstorm+thinkphp开发者的福利 记得两年前的这个时候,我开始学习php.我选择了thinkphp入门,写了我的第一个简单的cms.当时我什么都不懂,但是这里的技术氛围好的, ...
- Ubuntu下搭建NodeJS+Express WEB开发框架
Ubuntu下搭建NodeJS+Express WEB开发框架 2012-12-27 15:06 作者: NodeJSNet 来源: 本站 浏览: 2,966 次阅读 我要评论暂无评论 字号: 大 中 ...
- directX基础学习系列7 网格(自己创建)
D3DXMesh 以及 D3DXPMesh都是从ID3DXBaseMesh类中集成,mesh基本是对三角单元进行操作 ID3DXBaseMesh主要函数: HRESULT DrawSubset( DW ...
- Java中方法的覆写
所谓方法的覆写override就是子类定义了与父类中同名的方法,但是在方法覆写时必须考虑权限,即被子类覆写的方法不能拥有比父类方法更加严格的访问权限. 修饰符分别为public.protected.d ...
- C# .Net实现URL绝对路径和相对路径之间互相转换
网站制作开发中,URL的绝对路径和相对路径之间互相转换,是经常需要用到的.以下是在C#.Net下一种实现二者互相转化的方法: [DllImport("shlwapi.dll", C ...
- Mongo中的数组操作
当前mongo中有这么一条数据 book是一个数组,在他后面添加一条数据 { "_id" : ObjectId("5721f504d1f70435632b5ce7&quo ...
- 《linux内核设计与实现》读书笔记第一、二章
第一章 Linux内核简介 1.1 Unix的历史 1971年,Unix被移植到PDP-11型机中. 1973年,Unix操作系统用C语言改写——为Unix系统的广泛移植铺平了道路. 1977年,伯克 ...
- php--mongodb的安装
1.mongodb 安装 2.mongodb 扩展 http://pecl.php.net/package/mongo/1.6.14/windows
- yum安装node.js
1.安装EPEL库 yum install epel-release 2.安装Node.js yum install nodejs 3.安装nodejs中常用的npm软件包管理器 yum instal ...
- Android调用WCF
http://www.cnblogs.com/davidgu/archive/2012/05/16/2504182.html