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] = @0where (([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

时间: 2024-10-12 21:10:52

EF Code First DataAnnotations的相关文章

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

上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体之间的关系. ForeignKey Code first默认情况下会自动建立实体之间的关系,比如在EF框架step by step(3)—Code-First这篇随笔中所介绍那样. public partial class BlogUser{ public int BlogUserId { get;

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

上一篇EF框架step by step(7)—Code First DataAnnotations(1)描述了实体内部的采用数据特性描述与表的关系.这一篇将用DataAnnotations描述一下实体之间的关系. ForeignKey Code first默认情况下会自动建立实体之间的关系,比如在EF框架step by step(3)—Code-First这篇随笔中所介绍那样. public partial class BlogUser{ public int BlogUserId { get;

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 inheritance hierarchy and I explained Table per Hierarchy (TPH) as the default mapping strategy in EF Code First. We argued that the disadvantages of TPH m

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) post in a series that explains different approaches to map an inheritance hierarchy with EF Code First. I've described these strategies in previous po

EF Code First数据库映射规则及配置

EF Code First数据库映射规则主要包括以下方面: 1.表名及所有者映射 Data Annotation: 指定表名 1 using System.ComponentModel.DataAnnotations;2 3 [Table("Product")]4 public class Product指定表名及用户 using System.ComponentModel.DataAnnotations;[Table("Product", Schema = &qu

MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

http://www.cnblogs.com/darrenji/p/3809219.html 本篇为系列第一篇,包括: ■ 1.搭建项目■ 2.卸载Entity Framework组件,并安装最新版本■ 3.使用EF Code First创建领域模型和EF上下文■ 4.三层架构设计    □ 4.1 创建DAL层        ※ 4.1.1 MySportsStore.IDAL详解        ※ 4.1.2 MySportsStore.DAL详解 1.搭建项目 MySportsStore.

EF Code First自定义数据库(服务器及数据库名)连接配置

EF Code First数据库连接配置 通过EF Code First创建新的数据库,默认的都是: 命名空间.Models.MovieDbContext之类的数据库文件,如果想用自定义的数据库名称,则可以用下面的方法: 1.1.首先必须建立好Model文件 Models中Movie.cs 1 using System; 2 using System.ComponentModel.DataAnnotations; 3 using System.Data.Entity; 4 5 namespace

EF Code First:实体映射,数据迁移,重构(1)

一.前言 经过EF的<第一篇>,我们已经把数据访问层基本搭建起来了,但并没有涉及实体关系.实体关系对于一个数据库系统来说至关重要,而且EF的各个实体之间的联系,实体之间的协作,联合查询等也都依赖于这些实体关系. 二.实体映射 实体与数据库的映射可以通过DataAnnotation与FluentAPI两种方式来进行映射: (一) DataAnnotation DataAnnotation 特性由.NET 3.5中引进,给.NET中的类提供了一种添加验证的方式.DataAnnotation由命名空

使用 EF Code First + Mysql

这两天没事,研究EF 以往都是 连 mssql 微软亲儿子,换成了 mysql之后就问题百出,下面记录一下怎么使用 EF code first  +  mysql 数据库; 项目中,nuget先引入 EF 扩展 : 如果本地有EF扩展了,可以使用 程序包管理控制台安装,命令如下. PM> Install-Package EntityFramework -Version 6.0.0 然后nuget 安装    MySql.Data.Entity  这个扩展是mysql用来支持 EF 的 我这里引入