EF

OR/M

orm是一个封装、、是一个代理。底层还是Ado.net+Sql语句实现
比如:EF、dapper、NHibernate、Ibatis、suger
一个基本的ORM已经包含了对象的CRUD以及Mapping、事务、延迟、缓存等等高级特性
SQL都是通过反射生成的
因此内部有大量的反射。有性能影响。
但是ORM开发便捷、且还能适应不同数据库的迁移,而且也支持写sql

EF

1)DBFirst
再获取到数据库后。会自动生成一系列的文件
edmx是一个XML文档。来再vs中显示相应的表的信息
.tt是一个模板文档。来说明自动生成的其他代码的模板
edmx.design是描述性的文件
.Context是数据库的连接文件。
实体类映射的一张张表

using(advancedEntity context=new advancedEntity()){
User u=context.User.Find(10);
User u=context.User.Where(a=>a.id=28).FirstOrdefault();
}

其中的DbContent是有IDispose接口的引用。所以标准写法Using
Context的where是IQuerable的扩展方法。所以里边的参数是一个表达式目录树。
我们可以通过Context.Database.log+=s=>cw(s)来实现sql的查看
2)CodeFirstFromDB
自动生成所有的媒体类、以及app.config类的信息。还有model1的数据库链接信息
数据库和类之间的映射关系
1、特性table映射
2、Model文件映射
3、mapping文件映射【继承一个EntityTypeConfiguration】
3)CodeFirst
先添加引用ef.codefirst
代码先行。不关心数据库。从业务出发能够自动生成数据库。
在codefirst的时候。启动时的数据库与代码结构的同步再用默认的方式就可以
默认的逻辑是:不存在就创建new CreateDatabaseIfNotExists<codeFirstDbcontent>()
共有三种方式:

//每次都删除重建
new DropCreateDatabaseAlways<codeFirstDbcontent>()
//当有model修改的时候删除重建
new DropCreateDatabaseIfModelChanges<codeFirstDbcontent>()
//不存在就创建
new CreateDatabaseIfNotExists<codeFirstDbcontent>()

4)ModelFirst
就是在VS中通过模型去设计数据库。然后去生成数据库。相当于手写DbFirst的edmx文件。

linq中的join

在这里插入图片描述

CRUD中的SavaChange方法解析

SavaChange是以Context里为标准、如果监听到任何数据的变化、,然后会一次性保存到数据库中。并且会开启事务,多个语句开始。有一个失败。则全部回滚
EntityState
在这里插入图片描述
通过context.Entry<User>(Usernew).State来查看当前这个实体的状态来确认sql的生成逻辑
1、DetaChed
当前状态为DetaChed,则没有任何关系。随便修改都可以。
当remove或者不存在的时候就是DetaChed
2、unchanged
新增修改完成后。变化为unchangeed状态
3、Added
遇到Add()方法新增后就变成Added状态
4、Deleted
遇到remove方法编程deleted状态
5、Modified
判断当前数据存在。且存在修改。则为modified状态
可以通过Context.Attact(User)来实现监听。
可以实现以前的在修改前。先获取实体再全部修改的思路。

Context的生命周期

Context的find方式ishi可以使用缓存的
但是linq的方式都是通过数据库去查询的。
**AsNoTracking()**可以略微的提升性能。因为此时的状态为DetaChed的。不需要进行监听。
按需更新
Context是一个上下文环境。里边内置的对象跟踪。会开启链接就等于一个数据库连接
,一个请求最好只有一个Context。多线程下最好是多个实例。用完尽快释放

延迟查询

1、在set的时候,是没有进数据库的
2、迭代遍历数据才去数据库查询–在真是需求使用数据的时候(IEnumerator)
3、我们可以通过查询后增加.ToList(则可以直接加载出来)还有。迭代器、count,firstordefault
优点
延迟查询的好处。可以叠加多次查询,一次提交给数据库,可以按需获取
问题:
1、迭代器在用完了之后才会释放资源
2、脱离context的作用域

IEnumerable和IQuerable的延迟查询

1、IEnumerable类型,数据其实已经在内存中。有个迭代器的实现,用的是委托
2、IQuerable类型。数据在数据库内。这个list里边是一个表达式目录树—返回值类型–IquerProvider(查询的迟迟工具。sql语句的生成)
其实里边是一个包装对象。里面有表达式目录树、有结果类型。有解析工具。还有上下文。要数据的时候才去解析sql。执行sql。拿到数据的。----因为表达式目录树就是可以拼装的

导航属性

主外键表、主表有子表的集合、导航属性
子表里面还有哦个主表的实例。引用属性
这两个字段都是virtual的
延迟查询:条件virtual和默认配置
可以通过context.Configuration.LazyLoadingEnable=false来关闭延迟查询
Include是预先加载。Collection().Load()是显示加载

事务

1、TransactionScope最强大。甚至可以用在多个context上
2、SaveChange
3、context.Database.beginTranscation

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值