在微软官方关于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. JS实战 · 仿css样式选择器

    代码如下: <html> <head>     <meta http-equiv="Content-Type" content="text/ ...

  2. 用SQL语句创建四个表并完成相关题目-10月18日更新

    1. 查询Student表中的所有记录的Sname.Ssex和Class列. 2. 查询教师所有的单位即不重复的Depart列. 3. 查询Student表的所有记录. 4. 查询Score表中成绩在 ...

  3. OLE DB Command transformation 用法

    OLE DB Command transformation component 能够引用参数,逐行调用sqlcommand,This transformation is typically used ...

  4. Jetstrap 在线构建 Bootstrap 的工具

    Jetstrap 是一个 100% 基于 Web 的 Twitter Bootstrap 构建工具,无需下载软件,只需登录并构建即可.并且别人可以访问你构建的产品.

  5. Util应用程序框架公共操作类(四):验证公共操作类

    为了能够验证领域实体,需要一个验证公共操作类来提供支持.由于我将使用企业库(Enterprise Library)的验证组件来完成这项任务,所以本文也将演示对第三方框架的封装要点. .Net提供了一个 ...

  6. scikit-learn 朴素贝叶斯类库使用小结

    之前在朴素贝叶斯算法原理小结这篇文章中,对朴素贝叶斯分类算法的原理做了一个总结.这里我们就从实战的角度来看朴素贝叶斯类库.重点讲述scikit-learn 朴素贝叶斯类库的使用要点和参数选择. 1. ...

  7. JavaSE高级之集合类

    ​下面的内容是对java中的集合类进行的总结,过段时间会分享java的网路编程,多线程等内容,欢迎批评指正. 1.Java中的集合是用来存放对象的,即集合是对象的集合,对象是集合的元素,java AP ...

  8. iOS开发--AVFoundation自定义相机

    首先导入一个头文件 #import <AVFoundation/AVFoundation.h> 由于后面我们需要将拍摄好的照片写入系统相册中,所以我们在这里还需要导入一个相册需要的头文件 ...

  9. 使用yield进行异步流程控制

    现状 目前我们对异步回调的解决方案有这么几种:回调,deferred/promise和事件触发.回调的方式自不必说,需要硬编码调用,而且有可能会出现复杂的嵌套关系,造成"回调黑洞" ...

  10. C#异常处理的几个原则

    转载来自:http://www.oecp.cn/hi/LiuBP/blog/2312 在开发应用程序的时候,异常处理是非常的重要的,我找到一些异常处理准则,将它共享出来,如有不同意见,欢迎提出来一起探 ...