EF是怎么操作数据库

来源:互联网 发布:管锥编 知乎 编辑:程序博客网 时间:2024/06/05 03:33

与ADO.NET关系

ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案,早期被称为 ObjectSpace,最新版本是EF7【CodeOnly功能得到了更好的支持】

实体框架Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术。是微软的一个ORM框架。

1.查询

首先查询的时候new了一个EF上下文对象构造函数调用了父类的构造函数。

传入了一个连接字符串的nane 这个name在 webconfig 的 connectionstring中可以获取到连接字符串

新建EF的时候选的是什么数据库就是生成什么数据库的EF上下文对象 根据配置文件来的

查询的是时候通过IQueryable 下的扩展方法或者 Linq 生成相应的SQL语句 这里怎么根据类点属性的方式生成SQL语句主要是通过edmx这个XML配置的映射关系来生成的

new EF上下文的时候还是通过父类的构造函数已经创建好了数据库连接 这里还是ADO.Net

当我们要用数据的时候EF才会通过生成的sql语句查询数据库

这个时候查询到的对象应该是DataSet类型的 然后根据edmx 配置的映射关系转换成对应的集合。

存放在EF的代理中

这个代理类中有记录每个对象是状态值 默认的是unchanged

然后这个代理类我不能直接转换成json 当然这是在有导航属性的时候 也就是说有主外键的时候 因为EF不会为我们自动导航属性当 序列化的时候会自动去查询数据 然后导航属性类 具体的可能又有当前类的导航属性就死循环了。

2.删除

这个时候有两种三种方式

2.1 第一种是先根据ID到数据库查询这个对象封装到ef中

然后通过 db.set<类>().remove() 或者db.对象.remove()这都是一样的 将代理类对象的state 设置为deleted 然后 db.savechanges 这个是EF会坚持我们代理的对象的state 然后生成相应的 sql语句 通过ADO.NET去操作数据库 怎么生成SQL语句的跟上面一样 通过edmx

2.2 这是不先查询数据库 直接new一个实体对象 当然这个对象必须是edmx下面的TT模式自动生成的 不然在因为EF生成SQL语句的时候不能找到 edmx的映射关系这个配置文件。

其实代理就是这个类。

然后设置 DbEntityEntry 对象的state 为deleted

db.savechanges();就可以了

添加进去的对象必须要有Id值

还有一种的通过 db.类.attche() 貌似是这个写的忘记了这个单词

然后通过db.类.remove(model) 修改代理类的状态 然后db.savechanges()

3.修改

先通过EF 查询 出代理类 然后直接修改属性

这个时代理类DbEntityEntry 会把修改了的属性的ismodify设置为true 当 savechanges() 的时候会根据这些属性生成相应的sql数据

修改2 通过【sb.set<类型>(model)】(这里少了一个entry() 方法 不好意思) 返回 一个 DbEntityEntry 的对象

先这个这个对象的state 为 unchanged 因为这个 方式加进去的默认状态是 未追踪的 那个单词忘记了。

4 添加就更简单了

添加就是通过sb.set<类型>.add(model)

这个是就将这个你自己new 的类添加到EF容器中 将这个类 封装成代理类。

并且将这个代理的state设置为added

原创粉丝点击