第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定
一. 简介
1. DataAnnotations说明:EF提供以特性的方式添加到 domain classes上,其中包括两类:
A:System.ComponentModel.DataAnnotations命名空间下的特性是表中列的属性的。
包括:Key、Required、MinLength和MaxLength、StringLength、Timestamp、ConcurrencyCheck。
B:System.ComponentModel.DataAnnotations.Schema命名空间下的特性是控制数据库结构的。
包括:Table、Column、ForeignKey、NotMapped。
2. 特性介绍
① Key :声明主键
② Required:非空声明
③ MinLength和MaxLength:设置string类型的最大长度和最小长度,数据库的对应nvarchar
④ StringLength:设置string类型的长度,数据库对应nvarchar
⑤ Timestamp:将byte[]类型设置为timestamp类型
⑥ ConcurrencyCheck:并发检查,执行update操作时,会检查并发性(乐观锁)
⑦ Table: 给代码中的类换一个名来映射数据库中的表名.(还可以设置表的架构名称 [Table("myAddress", Schema = "Admin")] )
⑧ Column: 给代码中类的属性换一个名来映射数据库中表的列名. (还可以设置列的类型、列在表中的显示顺序 [Column("myAddressName2", Order = 1, TypeName = "varchar")])
⑨ ForeignKey:设置外键,特别注意里面的参数填写什么.
⑩ NotMapped: 类中的列名不在数据库表中映射生成. (还可以只设置get属性或者只设置set属性,在数据库中也不映射)
另外还有:Index、InverseProperty、DatabaseGenerated、ComplexType 这四个都不常用,在这里就不多介绍了
(详细可以看:http://www.entityframeworktutorial.net/code-first/dataannotation-in-code-first.aspx)
二. 代码实战
public class Student4
{
[Key] //主键声明
public string studentKey { get; set; } [Required] //非空声明
public string stuName { get; set; } [MaxLength()] //最大长度
public string stuTxt1 { get; set; } [MaxLength(), MinLength()] //最大长度和最小长度
public string stuTxt2 { get; set; } [Timestamp] //设置为时间戳
public byte[] rowVersion { get; set; } [ConcurrencyCheck] //并发检查
public string stuTxt3 { get; set; } public virtual StudentAddress4 stuAddress4 { get; set; }
} [Table("myAddress")] //设置类映射的数据库表名
//[Table("myAddress", Schema = "Admin")] //设置类映射的数据库表名和架构名
public class StudentAddress4
{
[ForeignKey("stu")] //设置外键(对应下面声明的 stu) //这里符合 类名+id(忽略大小写)的规则,所以自动生成主键
public string studentAddress4Id { get; set; } [Column("myAddressName")] //设置映射数据库中表的列名
public string stuAddressName { get; set; } [Column("myAddressName2", Order = , TypeName = "varchar")] //设置映射数据库中表的列名、顺序、类型
public string stuAddrssName2 { get; set; } [NotMapped]//不映射数据
public string addressNum { get; set; } //不映射数据
public string txt1 { get { return stuAddrssName2;} } //不映射数据
public string _txt2 = "";
public string txt2 { set { _txt2 = value; } } public virtual Student4 stu { get; set; } }
public class dbContext4 : DbContext
{
public dbContext4()
: base("name=dbContext4")
{ }
public DbSet<Student4> Student4 { get; set; } public DbSet<StudentAddress4> StudentAddress4 { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}
<!--正宗的CodeFirst DataAnnotation-->
<add name="dbContext4" connectionString="data source=localhost;initial catalog=CodeFirstDB4;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
三. 总结
DataAnnotations通过注解形式改变数据库结构,非常灵活,当然EF还提供另外一种方式 Fluent API的形式,可以将一个类映射成多个数据库表,还可以将配置写成多个文件,方便控制。
关于Fluent API更多用法,详解下一个章节。
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
第十五节: EF的CodeFirst模式通过DataAnnotations修改默认协定的更多相关文章
- 第十六节: EF的CodeFirst模式通过Fluent API修改默认协定
一. 简介 1. 优先级:Fluent API > data annotations > default conventions. 2. 所有的Fluent API配置都要在 OnMode ...
- 第十七节: EF的CodeFirst模式的四种初始化策略和通过Migration进行数据的迁移
一. 四种初始化策略 EF的CodeFirst模式下数据库的初始化有四种策略: 1. CreateDatabaseIfNotExists:EF的默认策略,数据库不存在,生成数据库:一旦model发生变 ...
- centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件、目录属性 shell数组简单用法 $( ) 和${ } 和$(( )) 与 sh -n sh -x sh -v 第三十五节课
centos shell脚本编程1 正则 shell脚本结构 read命令 date命令的用法 shell中的逻辑判断 if 判断文件.目录属性 shell数组简单用法 $( ) 和$ ...
- centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课
centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节 ...
- centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课
centos Linux系统日常管理2 tcpdump,tshark,selinux,strings命令, iptables ,crontab,TCP,UDP,ICMP,FTP网络知识 第十五节课 ...
- Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G
code&monkey Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...
- 大白话5分钟带你走进人工智能-第十五节L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归
第十五节L1和L2正则几何解释和Ridge,Lasso,Elastic Net回归 上一节中我们讲解了L1和L2正则的概念,知道了L1和L2都会使不重要的维度权重下降得多,重要的维度权重下降得少,引入 ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- EF的CodeFirst模式自动迁移(适用于开发环境)
EF的CodeFirst模式自动迁移(适用于开发环境) 1.开启EF数据迁移功能 NuGet包管理器------>程序包管理控制台---------->Enable-Migrations ...
随机推荐
- ueditor富文本编辑器使用百度地图自定义动态地图组件及兼容https及http协议
ueditor富文本编辑器默认支持百度地图组件,但是如果导入动态地图后会加很多默认的地图组件在上面.如果需要自定义动态地图的组件则需要修改ueditor特定的html. ueditor百度地图组件所在 ...
- 合并两个有序链表的golang实现
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 输入:->->, ->-> 输出:->->->->-> ...
- 阿里巴巴JAVA开发手册
Java编程规约 (一)命名风格 1. [强制] 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束. 反例: _name / __name / $O ...
- sqlalchemy外键的一些东西
sqlalchemy中让MySQL支持中文字符 engine = create_engine("mysql+pymysql://root:mysql8@localhost/mysqltest ...
- Linux下的快速配置虚拟环境virtualenvwrapper
一 安装包 pip3 install virtualenv virtualenvwrapper 二 设置linux的用户个人配置文件~/.bashrc WORKON_HOME=~/Envs 设置vir ...
- Offset Management For Apache Kafka With Apache Spark Streaming
An ingest pattern that we commonly see being adopted at Cloudera customers is Apache Spark Streaming ...
- SQL NULL 值
NULL 值是遗漏的未知数据. 默认地,表的列可以存放 NULL 值. 本章讲解 IS NULL 和 IS NOT NULL 操作符. SQL NULL 值 如果表中的某个列是可选的,那么我们可以在不 ...
- centos7 安装mysql5.7
[root@izbp1buyhgwtrvlxv3u2gqz soft]# wget http://dev.mysql.com/get/mysql57-community-release-el7-8.n ...
- MongoDB小东西
在mongodb中,show users 和db.system.users.find() 都能查看账户的相关信息,但是这两个命令有什么区别么? db.system.users.find() 是查看全局 ...
- SELECT list is not in GROUP BY clause and contains nonaggregated column
报错如下: Expression # of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘sss.m ...