前进中的蜗牛

番茄大叔

水滴穿石,非一日之功;没有量变,何来质变。

EntityFrameWork简单使用介绍

本篇是练习完微软官方例子后,对EntityFramework的总结。如果你是新手建议看下微软官方例子Getting Started with Entity Framework 6 Code First using MVC 5

CodeFirst

CodeFirst就是开发中,先不考虑数据库,直接根据领域模型建造业务实体,在通过持久将实体保存到数据库。利用EntityFramework可用很方便的实现CodeFirst。步骤如下

  1. 按照ef install-packages -entityframework
  2. 新建Model实体
  3. 实现DbContext作为当前数据上下文并配置文件webconfig添加connectionstrings,如果有多个类实现DbContext使用时需指明,(如果connectionstringskey值同数据上下文类名相同则会自动关联数据库,如不同重写构造函数)
  4. build,应用数据迁移enable-migrations可选参数ContextTypeName用于指明数据上下文类,运行会生成文件夹Migrations,可用定义填充数据
  5. add-migration 自定起名(最好具有对数据库更改有描述性)生成Model的修改对database的操作语句
  6. update-database将更新同步到数据库 在开发中对database多次修改可反复用 5-6

实体间的关系的生成

一些实体是相互关联的,那么怎么体现在Model和database上的呢?

  • 一对一:一个课程Course只属于一个办公室Department``Department的外键约束
public class Course
{
    public int DepartmentID { get; set; }
    public virtual Department Department { get; set; }
}

注意:反映在数据库表CourdeDepartmentID

  • 一对多:一个Department可有多个课程Course,则反映在导航属性上
public class Department
{
    public virtual ICollection<Course> Courses { get; set; }
}

Reading

通过ef从database读取数据,DbSet<Student>实现了IQueryable<>,可以通过Linq或Lambda表达式查询,单实体查询:

private SchoolContext db = new SchoolContext();
var students = from s in db.Students
						   select s;

对包括关联其他Model的属性的查询

  • Lazy loading 当访问到属性字段时才发送sql,查询:

  • Eager loading 渴望加载,通过一条sql语句,将关联属性也查出,反映到sql时join语句

注意可查看sql语句:departments.ToString();
注意 这里通过include一次加载数据,关于include这里说点:如果一个实体的属性还包含实体怎么办?
这里分情况看关联到的属性是个是集合:
第一层是集合:query.Include(e => e.Level1Collection),
两层非集合 query.Include(e => e.Level1Reference.Level2Reference),
两层集合query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Reference))

  • Explicite Loading 同Lazy loading当属性访问时loading data。但需要手动指定。当Lazy Loading关闭时使用,Lazy Loading当序列化时会加载关联属性可能消耗比较大。

数据保存

在添加或删除都是通过SaveChanges保存到数据库

  • 单实体添加数据 db.Students.Add(student); db.SaveChanges();
  • 删除单个实体: db.Students.Remove(student); db.SaveChanges();
  • 更新:先通过ef查询到实体,修改数据再SaveChanges,当有关联属性时直接修改其值,添加关联集合通过add,删除通过remove 最后SaveChanges.
posted @ 2018-09-14 16:57  LoveTomato  阅读(702)  评论(0编辑  收藏  举报