在EF实体框架之CodeFirst二中也提到数据库里面一般包括表、列、约束、主外键、级联操作、实体关系(E-R图)、存储过程、视图、锁、事务、数据库结构更新等。前面几篇博客把表、存储过程、视图这些算是总结了一下,这篇的话主要总结下基本的约定类型。

1.主键

在数据库中主键是必不可少的,一般主键有业务主键和逻辑主键,而且主键有的还是联合主键在code first中也可以通过约定的形式映射到数据库——[Key]。

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

默认主键约束:属性名为[ID]或[类名 + ID]而且是整数int类型。对于int类型的主键默认是自增的,但有时候不想自增长,可以通过以下方式进行取消自动增长。

        [Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int ProductID { get; set; }

DatabaseGeneratedOption 有三个选项:

  • DatabaseGeneratedOption.Computed 在用 Code First 生成数据库的时候你可以在 byte 或 timestamp 列上使用 DatabaseGenerated Annotation,否则就应该在数据库存在的情况下使用因为如果数据库不存在,此时 Code First 不知道为计算列(Computed Column)选择使用什么样的公式 
  • DatabaseGeneratedOption.Identity 如果主键为 integer 型,则数据库默认为自增长(效果等同于设置DatabaseGeneratedOption.Identity), 如果主键是 GUID 类型,则要显式设置自增长
  • DatabaseGeneratedOption.None 如果不想自增长,可设置成 DatabaseGeneratedOption.None
        [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid ProductID { get; set; }

对于联合主键,就不能使用约定了,要使用Fluent API。

            modelBuilder.Entity<Product>().HasKey(t=>new { t.ProductID,t.CategoryID});

2.列名

可以使用[Column]来指定列名以及映射到数据库的数据类型。

        [Column("Remark", TypeName ="text")]
public string Remark { get; set; }
            modelBuilder.Entity<Product>().Property(t => t.Remark).HasColumnName("Remark").HasColumnType("text");

3.数字类型长度及精度

对于decimal类型的数据,经常会保留几位小数,decima(8,2)这样子,在Data Annotation不支持该设置,需要通过Fluent API进行设置。

            modelBuilder.Entity<Product>().Property(t => t.UnitPrice).HasPrecision(, );

4.长度、数据类型及是否可空

在默认情况下,int类型的属性生成的列名对应SQL SERVER列int类型;而String类型的属性则对应SQL SERVER列的NVARCHAR类型。若类的字符串类型属性未设置MaxLength,则生成对应的列类型为NVARCHAR(MAX)。如果想限制字符串的长度可以通过使用MaxLength(最长字符长度)、MinLength(最短字符长度)、StringLength(字符长度)来约定。用Required来标识,还可以设置是否可允许空字符串,显示错误消息等。

        [Column("Remark", TypeName ="text")]
[Required,MaxLength(),MinLength()]
public string Remark { get; set; }
        [StringLength()]
public string PassWord { get; set; }

上面约定Remark最短20,最长100.但在Fluent API中并没有MinLength,只有MaxLength。

5.Unicode编码

对于string类型的默认都是映射成navrchar类型,如果想映射为varchar类型可以使用Fluent API的IsUnicode()设置。

            modelBuilder.Entity<Product>().Property(t => t.Remark).IsRequired().IsUnicode().HasColumnName("Remark").HasColumnType("text");

6.忽略映射NotMapped

如果哪天想去掉一个属性不想映射到数据库,如果直接注释掉,那可能在其他调用的地方就会报错,没有这个属性,这时可以使用NotMapped,忽略映射到数据库,这样也不会报错。同样对于表也是。

        [NotMapped]
public string ProductName { get; set; }
    [NotMapped]
public class Product
            modelBuilder.Entity<Product>().Ignore(t=>t.ProductName);
modelBuilder.Ignore<Product>();

7.Timestamp 和ConcurrencyCheck

这两个约定都是为了并发控制,Timestamp 在类中只能存在一个,而ConcurrencyCheck是针对类中的一个或多个属性。关于并发控制,这个会在以后详细总结。

        [Timestamp]
public Byte[] TimeStamp { get; set; }
        [Column("Remark", TypeName ="text")]
[ConcurrencyCheck, Required,MaxLength(),MinLength()]
public string Remark { get; set; }

8.其他

复杂数据类型这个会放在下一篇博客中讲解。关系特性:InverseProperty和ForeignKey会在关系映射中讲解。

9.使用上面的约束映射了几个比较特殊的到数据库。

EF实体框架之CodeFirst四的更多相关文章

  1. EF实体框架之CodeFirst一

    对于SQL Server.MySql.Oracle等这些传统的数据库,基本都是关系型数据库,都是体现实体与实体之间的联系,在以前开发时,可能先根据需求设计数据库,然后在写Model和业务逻辑,对于Mo ...

  2. EF实体框架之CodeFirst二

    在codefirst一中也说了Mapping是实体与数据库的纽带,model通过Mapping映射到数据库,我们可以从数据库的角度来分析?首先是映射到数据库,这个是必须的.数据库里面一般包括表.列.约 ...

  3. EF实体框架之CodeFirst六

    上午的时候把复杂类型学习了一下,想着趁着周六日把Code First学习完,所以下午还是把Code First中的关系学习下.在数据库中最重要的恐怕就是E-R图了,E-R体现了表与表直接的关系.使用C ...

  4. EF实体框架之CodeFirst五

    上一博客学习了下基本的约定配置,留下几个遗漏的,这篇就是学习下遗漏一复杂类型. 一.什么是复杂类型? 书中说道:“复杂类型也可视作值类型(?)可以作为附加属性添加到其他类.复杂类型与实体类型的区别在于 ...

  5. EF实体框架之CodeFirst三

    前两篇博客学习了数据库映射和表映射,今天学习下数据库初始化.种子数据.EF执行sql以及执行存储过程这几个知识. 一.数据库初始化策略 数据库初始化有4种策略 策略一:数据库不存在时重新创建数据库 D ...

  6. EF实体框架之CodeFirst七

    前面的6篇博客基本把Code First学习的差不多了,今天这篇学习下code first中的并发控制和事务,基本也快学完了,顶多就差数据迁移. 在数据库中也是有锁和事务的概念,在C#中也是存在,当然 ...

  7. EF实体框架之CodeFirst八

    前面七篇基本把Code First学习了一下,不过code first中会出现一个问题,就是数据迁移的问题. 一.数据准备 还是在前面的demo上修改,这次使用Province和City类. publ ...

  8. 【MVC 1】MVC+EF实体框架—原理解析

    导读:在之前,我们学过了三层框架,即:UI.BLL.DAL.我们将页面显示.逻辑处理和数据访问进行分层,避免了一层.两层的混乱.而后,我们又在经典三层的基础上,应用设计模式:外观.抽象工厂+反射,使得 ...

  9. 【EF 1】EF实体框架 原理+实例

    一.知识回顾 到目前为止,自己学到的链接数据库操作已经经历了几个阶段,分别是:学生信息管理和(第一次)机房收费时的直接连接数据库操作表格,然后是机房个人重构中应用的操作实体,在其中还利用了一个很重要的 ...

随机推荐

  1. C++类所占内存大小计算

    C++类所占内存大小计算 说明:笔者的操作系统是32位的. class A {}; sizeof( A ) = ? sizeof( A ) = 1明明是空类,为什么编译器说它是1呢? 空类同样可以实例 ...

  2. JavaScript中点号“.”的多义性

    点号「.」在JavaScript中有两种语义 语义1.表示算术中的小数点(浮点数),如 2.5 语义2.取对象属性.方法,如 [].push(2) 这几乎没有任何难理解的地方,但下面这个问题则很有趣. ...

  3. 清空select内容

    select1.options.length= 0 ; 清空 <ul id="ul"> <li>111</li> <li>111&l ...

  4. Oracle PLSQL

    Oracle :show explain plan select * from table(dbms_xplan.display); EXPLAIN PLAN FOR statements In fa ...

  5. CEPH块设备创建及快照

    1.创建image rbd create foo --size 1024 {--image-format 2}//创建一个名为foo的image,大小为1024M,当需要克隆快照时,需要添加大括号中的 ...

  6. Hog SVM 车辆 行人检测

    HOG SVM 车辆检测 近期需要对卡口车辆的车脸进行检测,首先选用一个常规的检测方法即是hog特征与SVM,Hog特征是由dalal在2005年提出的用于道路中行人检测的方法,并且取的了不错的识别效 ...

  7. 怎样Zbrush 4R7中添加和删除SubTool

    添加或删除SubTool在ZBrush®软件中是非常简单易操作的,通常在用SubTool面板已经给我们提供了相应的命令来对其进行操作,它能够将一个或多个格式为ZTL的文件同时添加进SubTool里. ...

  8. [转载]ExtJs4 笔记(7) Ext.tip.ToolTip 提示

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  9. POJ 2318 TOYS【叉积+二分】

    今天开始学习计算几何,百度了两篇文章,与君共勉! 计算几何入门题推荐 计算几何基础知识 题意:有一个盒子,被n块木板分成n+1个区域,每个木板从左到右出现,并且不交叉. 有m个玩具(可以看成点)放在这 ...

  10. *.location.href 用法:

    *.location.href 用法: top.location.href=”url”          在顶层页面打开url(跳出框架) self.location.href=”url”       ...