EntityFramework_基础
什么是EF
EF是一种ORM(Object-relational mapping)框架,它能把我们在编程时使用对象映射到底层的数据库结构。它可以让应用程序开发者将关系型数据作为业务模型来使用,也消除了开发者为数据访问编写的绝大多数管道代码的需要(比如使用ADO.NET)。Entity Framework提供了一个综合的、基于模型的系统,通过为所有的领域模型编写相似的数据访问代码,使得开发者创建数据访问层变得简单
EF优点
- 之前需要花费大量的时间来编写将数据保存到数据库的代码,EF极大的减少了这段时间
- 将重点放在业务上,而无需担心这些数据的存储
- 减少代码量提高生产系效率,同时也使得程序更容易维护
- ...
EF三种开发方式
Code First
所有的领域模型都是以类的形式编写的。这些类会建立我们的EDM,数据库模式会从这些类中创建。这种方法最适合于那些高度以领域为中心并且领域模型类创建优先的应用程序。这里需要的数据库只是为了这些领域模型的持久化机制。
- 数据库只是作为模型的持久化机制,即数据库中没有逻辑
- 完全控制代码,即没有自动生成的模型和上下文代码
- 数据库不会手动更改。模型类总是更改,然后数据库基于模型类的更改而更改
Database First
这是一种用于已存在数据库模式的方法。使用这种方法,EDM是从数据库模式中生成的,这种方法最适合于使用了已经存在的数据库的应用。
- 对遗留的数据库进行开发
- 当其他团队的DBA完成了数据库设计时,一旦数据库完成,应用开发就要开始
- 当要开发数据为中心的应用时,应用领域模型就是数据库本身,数据库会频繁修改来满足新的需求
Model First
这种方法和Code First方法很相似,但是这种情况下我们使用了EDM视觉设计器来设计我们的模型。数据库模式和类将会通过这个概念模型生成。该模型将会给我们创建数据库的SQL语句,然后我们可以使用它来创建数据库并连接应用程序。
EF安装及开发方式选择
NuGet:Install-Package EntityFramework
之前说到EF支持三种开发方式,在开发时如何选择适合自己的方式
- 如果已经有了域类,Code-first,通过类创建数据库
- 如果已经有数据库,Database-first:根据现有的数据库生成对应实体类和EDM文件
- 如果喜欢使用视觉设计图的方式设计数据库模型,Model-first
DbContext
DbContext是EntityFramewoke的一个重要组成部分。 他是一个域或实体类和数据库之间的桥梁。主要负责与数据交互,派生的类DbContext称为实体框架的上下文类
- EntitySet: DbContext包含所有的实体映射到数据库表的实体集(DbSet<TEntity>)
- 查询: DbContext 将LINQ-to-Entities查询转换为SQL查询并将其发送到数据库
- 更改跟踪: 它跟踪每个实体从数据库中查询出来后发生的修改变化
- 持久化数据: 它也基于实体状态执行插入、更新和删除操作到数据库中
- 缓存: DbContext默认第一级缓存
- 对象实例化: DbContext将原始表数据转换成实体对象
上下文类覆盖OnModelCreating方法。 可以用来在Code-first开始模式中配置实体
DBSet
DbSet 表示上下文中给定类型的所有实体的集合或可从数据库中查询的给定类型的所有实体的集合.代表一个实体集,用于创建、读取、更新和删除操作,可以使用 DbContext.Set 方法从 DbContext 中创建 DbSet对象,常见的DbSet类的方法如下:
| 名称 | 描述 |
|---|---|
| Add | 将给定实体以“已添加”状态添加到集的基础上下文中,这样一来,当调用 SaveChanges 时,会将该实体插入到数据库中 |
| AddRange | 将给定实体集合添加到基础化集的上下文中(每个实体都置于“已添加”状态),这样当调用 SaveChanges 时,会将它插入到数据库中 |
| AsNoTracking | 返回一个新查询,其中返回的实体将不会在 DbContext 中进行缓存. (继承自 DbQuery) |
| AsStreaming | 已过时. 返回将流式处理结果而非缓存它的新查询. (继承自 DbQuery<TResult>) |
| Attach | 将给定实体附加到集的基础上下文中. 也就是说,将实体以“未更改”的状态放置到上下文中,就好像从数据库读取了该实体一样 |
| Create | 为此集的类型创建新的实体实例. 请注意此实例不会添加或附加到此集. 如果基础上下文配置为创建代理且实体类型满足创建代理的要求,则返回的实例将是一个代理 |
| Create<TDerivedEntity>() | 为此集的类型或派生自此集类型的类型创建新的实体实例. 请注意此实例不会添加或附加到此集. 如果基础上下文配置为创建代理且实体类型满足创建代理的要求,则返回的实例将是一个代理 |
| Equals | 确定指定的 DbSet 是否等于当前 DbSet. (重写 DbQuery.Equals(Object)) |
| Equals | 确定指定的 DbSet 是否等于当前 DbSet. (重写 DbQuery.Equals(Object).) |
| Finalize | (继承自 Object.) |
| Find | 查找带给定主键值的实体. 如果上下文中存在带给定主键值的实体,则立即返回该实体,而不会向存储区发送请求. 否则,会向存储区发送查找带给定主键值的实体的请求,如果找到该实体,则将其附加到上下文并返回.如果未在上下文或存储区中找到实体,则返回 null |
| FindAsync | 异步查找带给定主键值的实体. 如果上下文中存在带给定主键值的实体,则立即返回该实体,而不会向存储区发送请求. 否则,会向存储区发送查找带给定主键值的实体的请求,如果找到该实体,则将其附加到上下文并返回. 如果未在上下文或存储区中找到实体,则返回 null |
| GetHashCode | 异步查找带给定主键值的实体. 如果上下文中存在带给定主键值的实体,则立即返回该实体,而不会向存储区发送请求. 否则,会向存储区发送查找带给定主键值的实体的请求,如果找到该实体,则将其附加到上下文并返回. 如果未在上下文或存储区中找到实体,则返回 null |
| GetType | 返回当前 DbSet 的类型 |
| Include | 指定要包括在查询结果中的相关对象. (继承自 DbQuery) |
| MemberwiseClone | (继承自 Object) |
| Remove | 将给定实体标记为“已删除”,这样一来,当调用 SaveChanges 时,将从数据库中删除该实体. 请注意,在调用此方法之前,该实体必须以另一种状态存在于该上下文中 |
| RemoveRange | 从基础化集的上下文中删除给定实体集合(每个实体都置于“已删除”状态),这样当调用 SaveChanges 时,会从数据库中删除它 |
| SqlQuery | 创建一个原始 SQL 查询,该查询将返回此集中的实体. 默认情况下,上下文会跟踪返回的实体;可通过对返回的 DbSqlQuery 调用 AsNoTracking 来更改此设置. 请注意返回实体的类型始终是此集的类型,而不会是派生的类型. 如果查询的一个或多个表可能包含其他实体类型的数据,则必须编写适当的 SQL 查询以确保只返回适当类型的实体. 与接受 SQL 的任何 API 一样,对任何用户输入进行参数化以便避免 SQL 注入攻击是十分重要的. 您可以在 SQL 查询字符串中包含参数占位符,然后将参数值作为附加参数提供. 您提供的任何参数值都将自动转换为 DbParameter. context.Blogs.SqlQuery("SELECT * FROM dbo.Posts WHERE Author = @p0", userSuppliedAuthor); 或者,您还可以构造一个 DbParameter 并将它提供给 SqlQuery. 这允许您在 SQL 查询字符串中使用命名参数. context.Blogs.SqlQuery("SELECT * FROM dbo.Posts WHERE Author = @author", new SqlParameter("@author", userSuppliedAuthor)) |
| ToString | 返回基础查询的 String 表示形式. (继承自 DbQuery<TResult>) |
| 访问MSND 查看 DBSet类的更多信息 |
开发方式视应用场景而定,此系列笔记使用Code-First
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
EntityFramework_基础的更多相关文章
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- node-webkit 环境搭建与基础demo
首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Golang, 以17个简短代码片段,切底弄懂 channel 基础
(原创出处为本博客:http://www.cnblogs.com/linguanh/) 前序: 因为打算自己搞个基于Golang的IM服务器,所以复习了下之前一直没怎么使用的协程.管道等高并发编程知识 ...
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- HTTPS 互联网世界的安全基础
近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...
- Swift与C#的基础语法比较
背景: 这两天不小心看了一下Swift的基础语法,感觉既然看了,还是写一下笔记,留个痕迹~ 总体而言,感觉Swift是一种前后端多种语言混合的产物~~~ 做为一名.NET阵营人士,少少多多总喜欢通过对 ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
随机推荐
- OGG-01028 Incompatible Record解决办法
How to recover from an OGG-01028 Incompatible Record if the trail is not corrupt (Doc ID 1507462.1) ...
- [INS-20802] Oracle Net Configuration Assistant failed
[INS-20802] Oracle Net Configuration Assistant failed.在安装Oracle 11g R2时出现了该错误提示.以前安装的时候没有碰到过类似的错误.原来 ...
- hadoop无法停止
停止hadoop集群,运行命令 $ sh stop-all.sh 出现提示: no resourcemanager to stop host10: no nodemanager to stop hos ...
- 对于Python中@property的理解和使用
@property 这个我们在很多代码中都会用到,简单讲即为一个只读属性的调用 如果需要有修改权限,需要再加一个@属性名.setter 例: #!/usr/bin/env python # -*- c ...
- MySQL 5.7.19 忘记密码 重置密码 配置文件my.ini示例 服务启动后停止 log配置
[参考]java 项目 存入mysql后 变问号 MySql 5.6 (X64) 解压版 1067错误与编码问题的解决方案 一.my.ini 的mysqld下添加 skip-grant-tables ...
- Python爬虫学习——布隆过滤器
布隆过滤器的实现方法1:自己实现 参考 http://www.cnblogs.com/naive/p/5815433.html bllomFilter两个参数分别代表,布隆过滤器的大小和hash函数的 ...
- Ubuntu16.04安装xgboost
1.Python下安装方法 git clone --recursive https://github.com/dmlc/xgboost cd xgboost make -j4 cd python-pa ...
- Scala学习笔记(三):==,eq与equals的区别
== Scala中==与java中不同,它是比较值是否相等的,无论比较对象是否是相同类型 List(1, 2, 3) == List(1, 2, 3) //true 1==1.0//true equa ...
- 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字
思路分析:任何一个数字异或它自己都等于0,根据这一特性,如果从头到尾依次异或数组中的每一个数字,因为那些出现两次的数字全部在异或中抵消掉了,所以最终的结果刚好是那些只出现一次的数字. 代码如下: #i ...
- centos7上设置中文字符集
author: headsen chen date: 2019-03-14 09:00:31 Linux系统会默认使用英文字符集,不会安装中文字符集等其他字符. 公司内部文件服务器等需要中文 ...
