entityframework学习笔记--005-给code first一个正确的解释
在微软官方关于ef7的介绍中强调,ef7将舍弃database first、model first,只保留code first的使用。这引起了很多人的担忧,担忧源自对code first的错误理解。因为很多人认为code first是区别于database first与model first的第三种方式,其实这是错误的理解。其实code first是替代前两种方式的解决方案。换句话来说,Code First 不是相对 Database First 和Model First的第三种方式,而是一种可以替代EDMX文件格式的方案。从概念上讲,Code First 同时支持Database First和Model First工作方式。 这的确让人感到混乱,我们取错了名字。 或许叫它“基于代码建模(code-base modeling)”会更清晰些。这里有一篇关于ef7的介绍文档:https://msdn.microsoft.com/zh-cn/magazine/dn890367.aspx
1.首先为你的项目安装上entityframework,然后右键你的项目,添加两个实体类文件,类文件信息如下:
public class Class
{
public int Id { get; set; }
public string Name { get; set; }
public virtual List<Student> Students { get; set; }
public Class()
{
Students = new List<Student>();
}
}
public class Student
{
//[Key]
public int Id { get; set; }
public string Name { get; set; }
public int ClassId { get; set; } //[ForeignKey("ClassId")]
public virtual Class Class { get; set; }
}
1.2 在添加一个继承自DbContext的类,DbContext类是ef的数据访问核心。类信息如下:
public class MyEfRecipesContext:DbContext
{
public MyEfRecipesContext()
{
//Database.SetInitializer(new CreateDatabaseIfNotExists<MyEfRecipesContext>());
}
public DbSet<Student> Students { get; set; }
public DbSet<Class> Classs { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//这里可以用于模型创建前的配置修改
}
}
上图中的注释代码是可以省略的,因为ef的默认配置就是这样。当然你可以手动更改配置信息。在ef中有一个原则“约定大于配置”,约定其实也就是默认配置,意思就是说ef中的约定最好不要主动去修改它。下面是ef的一些默认约定:
(1) 数据库映射:Code First 默认会在本地的SQL Expression数据库中建立一个和DbContext的子类的全名相同的数据库,全名指的是命名空间加上类名。
(2)表映射:Code First 默认会按照类型名复数建立数据表,比如说Student类对应的表名就叫Students.
(3)列映射:Code First 默认会按照类中的属性名建立column,它还有默认的数据类型映射习惯,int会映射为interger,string会映射为nvarchar(max),decimal会映射为decimal(18,2)。后边会介绍如何更改column的名称,类型以及其他特性。
(4)主键映射:Code First 默认会在类的属性中需找名字为Id或类型名称+Id的int类型的属性作为主键,并且是自增字段。这些也是可以改的。
1.3 在App.config中添加配置文件,如果是Web程序配置文件则是Web.config,这个不用介绍了吧。连接字符串信息如下:
<connectionStrings>
<add name="MyEfRecipesContext" connectionString="Data Source=.;Initial Catalog=myefrecipes;User Id=sa;Password=renjing2000;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
</connectionStrings>
2.示例代码。新增与查询,输出见图5-1:
using (MyEfRecipesContext db = new MyEfRecipesContext())
{
Class c1 = new Class() { Name = "class1" };
Student s1 = new Student() { Name = "rj1", Class = c1 };
Student s2 = new Student() { Name = "rj2", Class = c1 }; db.Students.Add(s1);
db.Students.Add(s2);
int i = db.SaveChanges(); Console.WriteLine("id\t姓名\t班级");
foreach (var item in db.Students)
{
Console.WriteLine("{0}\t{1}\t{2}",item.Id,item.Name,item.Class.Name);
}
}

图5-1
3.运行程序后,生成的表结构如图5-2。可以发现Students表月Classes表生成了“一对多”的关系,和我们的预期一样。“__MigrationHistory”是ef自动生成的一张表,主要用于ef的一些配置信息,可以不用关心。

图5-2
entityframework学习笔记--005-给code first一个正确的解释的更多相关文章
- QML学习笔记(五)— 做一个简单的待做事项列表
做一个简单的QML待做事项列表,能够动态添加和删除和编辑数据 GitHub:八至 作者:狐狸家的鱼 本文链接:QML学习笔记(五)— 做一个待做事项列表 主要用到QML:ListView 效果 全部代 ...
- go语言,golang学习笔记4 用beego跑一个web应用
go语言,golang学习笔记4 用beego跑一个web应用 首页 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/ 更新的命令是加个 -u 参数,g ...
- Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程
Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- Android学习笔记(二)——探究一个活动
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件,主要用于和用户进行交互.一 ...
- Android学习笔记(一)——新建一个项目
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 1.打开Android Studio时出现以下界面,点击”start a new Android Studio ...
- [Python学习笔记-005] 理解yield
网络上介绍yield的文章很多,但大多讲得过于复杂或者追求全面以至于反而不好理解.本文用一个极简的例子给出参考资料[1]中的讲解,因为个人觉得其讲解最为通俗易懂,读者只需要对Python的列表有所了解 ...
- entityframework学习笔记--006-表拆分与实体拆分
1.1 拆分实体到多张表 假设你有如下表,如图6-1.Product表用于存储商品的字符类信息,ProductWebInfo用于存储商品的图片,两张表通过SKU关联.现在你想把两张表的信息整合到一个实 ...
- entityframework学习笔记--004-无载荷与有载荷关系
1.无载荷(with NO Payload)的多对多关系建模 在数据库中,存在通过一张链接表来关联两张表的情况.链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到实体框架模 ...
- entityframework学习笔记--002-database first
1.实体框架紧紧地和Visual Studio集成在一起,为了在你的应用程序中使用实体框架,我们增加一个ADO.NET实体数据框架到你的项目.方法如下: 右键你的项目,然后选择 ➤New Item(新 ...
随机推荐
- DDN - Digital Data Network
DDN(Digital Data Network,数字数据网)是一种利用光纤.数字微波或卫星等数字传输通道和数字交叉复用设备组成的数字数据传输网.它可以为用户提供各种速率的高质量数字专用电 数字数据网 ...
- Java异常内容总结
在程序开发中,可能存在各种错误,有些错误是可以避免的,而有些错误却是意想不到的,在Java中把这些可能发生的错误称为异常. Throwable类是所有异常类的超类,该类的两个直接子类是Error和Ex ...
- JavaScript中的百变大咖~this
原文链接:http://www.jeffjade.com/2015/08/03/2015-08-03-javascript-this/ JavaScript作为一种脚本语言身份的存在,因此被很多人认为 ...
- Apache-Tomcat的安装配置
现在将使用Tomcat的一些经验和心得写到这里,作为记录和备忘.如果有朋友看到,也请不吝赐教. 1.首先是Tomcat的获取和安装. 获取当然得上Apache的官方网站下载,开源免费,而且带宽也足够. ...
- Sql Server系列:多表连接查询
连接查询是关系数据中最主要的查询,包括内连接.外连接等.通过连接运算符可以实现多个表查询.内连接查询操作列出与连接条件匹配的数据行,它使用比较运算符比较被连接列的列值.SQL Server中的内连接有 ...
- lua中的数据类型
lobject.h: lobject.h: 其中使用GCObject表示的数据类型是需要lua 的gc记录的. lstate.h: lobject.h:
- JS preventDefault ,stopPropagation ,return false
所谓的事件有两种:监听事件和浏览器对特殊标签元素的默认行为事件.监听事件:在节点上被监听的事件操作,如 select节点的change事件,a节点的click事件.浏览器的默认事件:特定页面元素上带的 ...
- 【原创】开源Math.NET基础数学类库使用(01)综合介绍
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- Neutron 架构 - 每天5分钟玩转 OpenStack(67)
前面我们讨论了 Neutron 的基本概念,今天我们开始分析 Neutron 的架构. Neutron 架构 与 OpenStack 的其他服务的设计思路一样,Neutron 也是采用分布式架构,由多 ...
- 使用karma测试平时写的小demo(arguments为例)
有人说前端自动化测试非常困难,我觉得确实如此.在项目中,我个人也不放心写的测试,还是要手动测试.但是我们平时写demo学习时,完全可以使用自动化测试. 传统demo 1,新建一个html 2,写入js ...