EF实体框架之CodeFirst四
在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四的更多相关文章
- EF实体框架之CodeFirst一
对于SQL Server.MySql.Oracle等这些传统的数据库,基本都是关系型数据库,都是体现实体与实体之间的联系,在以前开发时,可能先根据需求设计数据库,然后在写Model和业务逻辑,对于Mo ...
- EF实体框架之CodeFirst二
在codefirst一中也说了Mapping是实体与数据库的纽带,model通过Mapping映射到数据库,我们可以从数据库的角度来分析?首先是映射到数据库,这个是必须的.数据库里面一般包括表.列.约 ...
- EF实体框架之CodeFirst六
上午的时候把复杂类型学习了一下,想着趁着周六日把Code First学习完,所以下午还是把Code First中的关系学习下.在数据库中最重要的恐怕就是E-R图了,E-R体现了表与表直接的关系.使用C ...
- EF实体框架之CodeFirst五
上一博客学习了下基本的约定配置,留下几个遗漏的,这篇就是学习下遗漏一复杂类型. 一.什么是复杂类型? 书中说道:“复杂类型也可视作值类型(?)可以作为附加属性添加到其他类.复杂类型与实体类型的区别在于 ...
- EF实体框架之CodeFirst三
前两篇博客学习了数据库映射和表映射,今天学习下数据库初始化.种子数据.EF执行sql以及执行存储过程这几个知识. 一.数据库初始化策略 数据库初始化有4种策略 策略一:数据库不存在时重新创建数据库 D ...
- EF实体框架之CodeFirst七
前面的6篇博客基本把Code First学习的差不多了,今天这篇学习下code first中的并发控制和事务,基本也快学完了,顶多就差数据迁移. 在数据库中也是有锁和事务的概念,在C#中也是存在,当然 ...
- EF实体框架之CodeFirst八
前面七篇基本把Code First学习了一下,不过code first中会出现一个问题,就是数据迁移的问题. 一.数据准备 还是在前面的demo上修改,这次使用Province和City类. publ ...
- 【MVC 1】MVC+EF实体框架—原理解析
导读:在之前,我们学过了三层框架,即:UI.BLL.DAL.我们将页面显示.逻辑处理和数据访问进行分层,避免了一层.两层的混乱.而后,我们又在经典三层的基础上,应用设计模式:外观.抽象工厂+反射,使得 ...
- 【EF 1】EF实体框架 原理+实例
一.知识回顾 到目前为止,自己学到的链接数据库操作已经经历了几个阶段,分别是:学生信息管理和(第一次)机房收费时的直接连接数据库操作表格,然后是机房个人重构中应用的操作实体,在其中还利用了一个很重要的 ...
随机推荐
- 关于移动端的font和图片的问题
一.font-family 使用无衬线字体 body { font-family: "Helvetica Neue", Helvetica, STHeiTi, sans-serif ...
- easyui-validatebox 验证两次密码是否输入一致
验证两次密码是否输入一致 $.extend($.fn.validatebox.defaults.rules, { /*必须和某个字段相等*/ equalTo: { vali ...
- nginx 负载均衡示例
一.nginx nginx是一个轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,以开源形式发布.nginx的性能稳定,功能丰富,配置简单,且占用系统资源低.可支持多个 ...
- Eclipse 快捷键 篇
1. Ctrl+Shift+R:打开资源这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xml ...
- oracle的增删改查语句
创建一个表: cteate table 表名(列1 类型, 列2 类型);查看表结构 desc表名添加一个字段 alter table 表名 add(列类型);修改字段类型 alter table 表 ...
- 记一次查内存异常问题(续《记一次Web应用CPU偏高》)
继上一次查应用的CPU飙高问题(http://www.cnblogs.com/hzmark/p/JVM_CPU.html)过去10天了.上次只是定位到了是一个第三方包占用了大量的CPU使用,但没有细致 ...
- mysql中count(),group by使用
count()统计表中或数组中记录 count(*)返回检索行的数目,且不论其值中是否包含NULL count(column_name)返回的是对列中column_name不为NULL的行的统计 例如 ...
- zookeeper适用场景:如何竞选Master及代码实现
问题导读:1.如何利用zookeeper保证集群Master可用性和唯一性?2.zookeeper竞选Master包含哪些过程?3.zookeeper竞选Master机制利用了zk哪些特性? 在zoo ...
- NOIP2007 T2纪念品分组 解题报告-S.B.S.
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #inclu ...
- HDU 1698 & UESTC 1228 Just a hook
算是线段树中的一道水题了,必须用到懒操作,否则会超时.或者也可以刚开始不计算和,只更新节点,最后算整个线段的颜色和. 1.懒操作法 /* 908ms 3448KB in HDU OJ*/ #inclu ...