EntityFrameWork简单使用介绍
本篇是练习完微软官方例子后,对EntityFramework的总结。如果你是新手建议看下微软官方例子Getting Started with Entity Framework 6 Code First using MVC 5
CodeFirst
CodeFirst就是开发中,先不考虑数据库,直接根据领域模型建造业务实体,在通过持久将实体保存到数据库。利用EntityFramework可用很方便的实现CodeFirst。步骤如下
- 按照ef
install-packages -entityframework
- 新建Model实体
- 实现
DbContext
作为当前数据上下文并配置文件webconfig添加connectionstrings
,如果有多个类实现DbContext
使用时需指明,(如果connectionstrings
的key
值同数据上下文类名相同则会自动关联数据库,如不同重写构造函数) build
,应用数据迁移enable-migrations
可选参数ContextTypeName
用于指明数据上下文类,运行会生成文件夹Migrations
,可用定义填充数据add-migration 自定起名(最好具有对数据库更改有描述性)
生成Model的修改对database的操作语句update-database
将更新同步到数据库 在开发中对database多次修改可反复用 5-6
实体间的关系的生成
一些实体是相互关联的,那么怎么体现在Model和database上的呢?
- 一对一:一个课程
Course
只属于一个办公室Department``Department
的外键约束
public class Course
{
public int DepartmentID { get; set; }
public virtual Department Department { get; set; }
}
注意:反映在数据库表Courde
上DepartmentID
为
- 一对多:一个
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
.