连接情景中的CRUD操作:

连接场景中的CRUD操作是一项相当简单的任务,因为默认情况下,上下文会自动跟踪实体在其生命周期中发生的更改,前提是AutoDetectChangesEnabled为true。

以下示例显示了如何在连接方案(在上下文的范围内)中添加,更新和删除实体,然后该实体又将在数据库上执行插入,更新和删除命令。上下文将自动检测更改并更新实体的状态。

断开的实体:

当我们得到一个断开的实体图,甚至一个断开的实体时,我们需要做两件事情。首先,我们需要使用新的上下文实例附加实体,并使上下文知道这些实体。其次,手动为这些实体设置合适的EntityStates,因为新的上下文实例不知道在断开的实体上执行的操作,所以新的上下文不能应用适当的EntityState。

示意图:

DbSet.Add():

DbSet.Add()方法将整个实体图形附加到新的上下文,并自动将添加的实体状态应用于所有实体。

使用父DbSet实体的Add方法将整个实体图附加到具有Added状态的新的上下文实例。调用ctx.Savechanges()将为所有实体执行插入命令,这会将新行插入到适当的数据库表中。

DbSet.Attach():

DbSet.Attach方法将整个实体图形附加到具有不变实体状态的新上下文中。

Attach方法只会将实体图附加到上下文中,所以我们需要为每个实体找到适当的实体状态并手动应用。

DbContext.Entry():

DbContext的Entry方法返回指定实体的DbEntityEntry实例。DbEntityEntry可以用来改变一个实体的状态。

在断开的情况下使用DBContext添加新实体:

在断开的情况下使用DBContext更新现有实体:

步骤:

①从数据库获取现有的学生。

②将学生姓名改为上下文范围(断开模式)

③将修改的实体传递给Entry方法以获取其DBEntityEntry对象,然后将其状态标记为Modified

④调用SaveChanges()方法将学生信息更新到数据库中。

在断开的情况下使用DBContext删除实体:

使用DbContext添加实体图:

我们可以使用DbSet.Add()方法将整个实体图形附加到上下文中,并将所有实体的状态设置为Added。

使用DbContext更新实体图:

在断开的情况下更新实体图是一项复杂的任务。

在断开的场景中更新实体图形的问题在于,上下文不知道在客户端执行了哪些操作。根据下图,新的上下文不知道每个实体的状态:

在断开的情况下识别实体状态的模式:

在断开的情况下,有几种方法(如下所示)来标识实体状态:

  1. 使用实体的PrimaryKey(Id)属性
  2. 在实体集中设置一个属性来保存状态 (学习的时候可以这样设计)

1)使用实体的PrimaryKey属性:

您可以使用每个实体的PrimaryKey(Id)属性来确定其实体状态。但是,您必须决定使用以下哪个架构规则:

  • 每种类型的实体都必须有Id属性(PK)
  • Id属性的默认值应为0

在断开的情况下,context2不知道每个实体的状态。它必须通过使用StandardId来确定Standard实体的状态,并使用TeacherId属性来确定Teacher实体的状态。如果StandardId和TeacherID的值为零,则表示它是一个新的实体,如果它不是零,那么它是一个修改的实体。(这个比较好理解)

优点:

  • 无需额外的编码/处理来确定实体状态。
  • 很好的表现。

缺点:

  • 每个实体类型都需要有一个Id属性。它不能确定没有Id属性的实体的状态。
  • 无法识别未更改的实体。即使实体没有被改变,它也被设置为Modified状态。因此,对于未更改的实体存在不必要的数据库更新语句。
  • 无法处理删除实体场景。它需要单独处理删除。

2)在每个实体拥有状态:

①创建一个接口,声明一个枚举

②让实体继承改接口

上面的代码修改了一个Teacher,新建了一个Teacher,和新建了一个Standar

优点:

  • 无需额外的编码/处理来确定实体状态
  • 已添加,已修改,已删除和未更改状态正确
  • 没有不必要的更新调用不变的实体。

坏处:

  • 需要在断开模式下设置每个实体的适当状态。所以在断线模式下需要格外小心。

实体框架中的并发:

SQL里面处理并发则是使用多线程来处理,对有并发的数据实现同步,只能一个一个的去访问数据。再就是使用锁,在有人访问这个数据的时候别人是访问不了的。

①Student表里面有个RowVersion字段是 timestamp(时间戳)类型,在添加,更新的时候会自动变化

②打开设计器修改Student实体中的RowVersion属性,更改并发模式

③测试并发

   数据库中只修改了一次

至于怎么去处理并发这里就不做深入研究了。

Entity Framework 五的更多相关文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (22) -----第五章 加载实体和导航属性之延迟加载

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第五章 加载实体和导航属性 实体框架提供了非常棒的建模环境,它允许开发人员可视化地使 ...

  2. 《Entity Framework 6 Recipes》中文翻译系列 (23) -----第五章 加载实体和导航属性之预先加载与Find()方法

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-2  预先加载关联实体 问题 你想在一次数据交互中加载一个实体和与它相关联实体. ...

  3. 《Entity Framework 6 Recipes》中文翻译系列 (24) ------ 第五章 加载实体和导航属性之查询内存对象

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-4  查询内存对象 问题 你想使用模型中的实体对象,如果他们已经加载到上下文中, ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (25) ------ 第五章 加载实体和导航属性之加载完整的对象图和派生类型上的导航属性

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-5  加载完整的对象图 问题 你有一个包含许多关联实体的模型,你想在一次查询中, ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (26) ------ 第五章 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作中使用Include()方法

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-7  在别的LINQ查询操作中使用Include()方法 问题 你有一个LINQ ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9  关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (28) ------ 第五章 加载实体和导航属性之测试实体是否加载与显式加载关联实体

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-11  测试实体引用或实体集合是否加载 问题 你想测试关联实体或实体集合是否已经 ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 (29) ------ 第五章 加载实体和导航属性之过滤预先加载的实体集合和修改外键关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-13  过滤预先加载的实体集合 问题 你想过滤预先加载的实体集合,另外,你想使用 ...

  9. Entity Framework学习笔记(五)----Linq查询(2)---贪婪加载

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们使用了Linq对Entity Framework进行了一个查询,但是通过学习我们却发现了懒加载给我来的性能上的 ...

随机推荐

  1. BNU29139——PvZ once again——————【矩阵快速幂】

    PvZ once again Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java cla ...

  2. Python正则表达

    ```# -*- coding:utf-8 -*-import re re - Support for regular expressions (RE).正则表达式是一个特殊的字符序列,它能帮助你方便 ...

  3. Node.js 框架对比之 Express VS Koa

    背景 上图是一个典型的采用 Node.js 开发 web 应用的前后端结构,下面介绍一下 Node 服务层在其中的作用以及使用 Node.js 的一些优劣. Node 服务层作用: 请求代理 传统做法 ...

  4. 数据库中存放着HTML并附带样式,如何在界面上对已有的样式进行修改

    在工作中遇到这样一个问题,数据库中存放着HTML代码,并且还带有样式,我要在界面上修改他已经写好的样式,例如把这个字段的字体改成微软雅黑,数据库中对应字段内容如下图 在界面面上是直接把上图这段HTML ...

  5. C#中TransactionScope的使用方法和原理(摘)

    出自51CTO博客:http://cnn237111.blog.51cto.com/2359144/1271600 在.net 1.1的时代,还没有TransactionScope类,因此很多关于事务 ...

  6. 轻松掌握java读写锁(ReentrantReadWriteLock)的实现原理

    转载:https://blog.csdn.net/yanyan19880509/article/details/52435135 前言 前面介绍了java中排它锁,共享锁的底层实现机制,本篇再进一步, ...

  7. 洛谷P1730 最小密度路径(floyd)

    题意 题目链接 Sol zz floyd. 很显然的一个dp方程\(f[i][j][k][l]\)表示从\(i\)到\(j\)经过了\(k\)条边的最小权值 可以证明最优路径的长度一定\(\leqsl ...

  8. 【Linux】Windows与Linux之间的文件共享(基于网络)

    切记:Linux的安全机制的存在--iptables和selinux. 一.操作前提 1.1 从Windows能够ping通Linux 1.2 关闭Linux防火墙 command1:/etc/ini ...

  9. Jmeter各部件的作用

    JMeter主要组件介绍 1.测试计划(Test Plan)是使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器. 2.线程组(Thread Group)代表一定数量的并发用户 ...

  10. centos apache 腾讯云ssl证书配置

    首先向证书机构申请https证书,会得到证书和私钥,这里我以腾讯云证书安装为例(非常简单) 分两步走 1.申请 点击腾讯云控制台->产品模块下的ssl证书管理->点击申请证书(免费的,不要 ...