在微软官方关于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一个正确的解释的更多相关文章

  1. QML学习笔记(五)— 做一个简单的待做事项列表

    做一个简单的QML待做事项列表,能够动态添加和删除和编辑数据 GitHub:八至 作者:狐狸家的鱼 本文链接:QML学习笔记(五)— 做一个待做事项列表 主要用到QML:ListView 效果 全部代 ...

  2. go语言,golang学习笔记4 用beego跑一个web应用

    go语言,golang学习笔记4 用beego跑一个web应用 首页 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/ 更新的命令是加个 -u 参数,g ...

  3. Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程

    Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  4. Android学习笔记(二)——探究一个活动

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件,主要用于和用户进行交互.一 ...

  5. Android学习笔记(一)——新建一个项目

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 1.打开Android Studio时出现以下界面,点击”start a new Android Studio ...

  6. [Python学习笔记-005] 理解yield

    网络上介绍yield的文章很多,但大多讲得过于复杂或者追求全面以至于反而不好理解.本文用一个极简的例子给出参考资料[1]中的讲解,因为个人觉得其讲解最为通俗易懂,读者只需要对Python的列表有所了解 ...

  7. entityframework学习笔记--006-表拆分与实体拆分

    1.1 拆分实体到多张表 假设你有如下表,如图6-1.Product表用于存储商品的字符类信息,ProductWebInfo用于存储商品的图片,两张表通过SKU关联.现在你想把两张表的信息整合到一个实 ...

  8. entityframework学习笔记--004-无载荷与有载荷关系

    1.无载荷(with NO Payload)的多对多关系建模 在数据库中,存在通过一张链接表来关联两张表的情况.链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到实体框架模 ...

  9. entityframework学习笔记--002-database first

    1.实体框架紧紧地和Visual Studio集成在一起,为了在你的应用程序中使用实体框架,我们增加一个ADO.NET实体数据框架到你的项目.方法如下: 右键你的项目,然后选择 ➤New Item(新 ...

随机推荐

  1. 支持向量机(SVM)复习总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略 ...

  2. Android开发学习之路-Android Studio真神器!

    放假之后电脑配置升级就开始用Android Studio(下面简称AS)了,那个酸爽真的不是一般的啊,这里开一篇博客来记录下AS里面各种酷炫的功能,有更好玩的,大家不要吝啬,评论告诉我吧! 最近And ...

  3. HTTP学习二:Web应用中的HTTP

    1 HTTP连接 1.1 TCP连接对性能的影响 TCP三次握手如下图: 如上图,建立一次TCP连接要经过三个步骤.HTTP是建立在TCP之上的,因此TCP连接的性能直接影响HTTP的性能. TCP影 ...

  4. java 成长之路

    分享总结 title: java 成长之路 tags: grammar_cjkRuby: true 经验差异 1-3年 要求 建议 3-5年 建议 5年+ 经验差异 最近一年比较忙,经历了创业公司的倒 ...

  5. 学习3ds max插件开发过程中的一些小结

    1. 3ds max是以树状结构来管理整个场景的,每个树节点类型为INode 2. Interface类很关键,可以通过其中的GetRootNode.NumberOfChildren和GetChild ...

  6. 传智播客--ADO.net--SqlBulkCopy批量插入数据(小白必知)

    一般情况下,我们在向数据库中插入数据时用Insert语句,但是当数据量很大的时候,这种情况就比较缓慢了,这个时候就需要SqlBulkCopy这个类. SqlBulkCopy本身常用的函数有这么几个 D ...

  7. 【转】SQL删除重复数据方法,留着备用

    感谢孙潇楠前辈的总结,地址http://www.cnblogs.com/sunxiaonan/archive/2009/11/24/1609439.html 例如: id           name ...

  8. es6学习笔记一数组(下)

    entries() 方法: 概述:    entries() 方法返回一个 Array Iterator(数组迭代) 对象,该对象包含数组中每一个索引的键值对. 示例: let arr = [&quo ...

  9. Android之TabActivity的使用

    TabActivity实现多页显示效果 由于手机屏幕有限,所以我们要尽量充分利用屏幕资源.在我们的应用程序中通常有多个Activity,而且会经常切换显示,这样我们就可以用TabActivity来显示 ...

  10. 窥探Swift之数组安全索引与数组切片

    今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...