Entity Framework入门教程(9)---离线场景附加实体图集到上下文
附加离线实体图集到上下文
这节主要内容是通过不同的方法将离线实体附加到上下文中。
在离线场景中,保存一个实体要略微困难一些。当我们保存一个离线的实体图集或一个单独的离线实体时,我们需要做两件事。首先,我们要把实体附加到新的上下文中,让上下文了知道存在这些实体。其次,我们需要手动设置每个实体的EntityState,因为新的上下文不知道这些离线实体都经过了些什么操作,所以新的上下文不能自动地给实体添加EntityState。
下图说明了此过程。

为了将离线实体附加到上下文,并为实体图中的每个实体设置EntityState,EF提供下边几种方法:
1.DbContext.Entry(entity).State=EntityState.Added/Modified/Deleted
DbContext.Entry()方法返回一个指向特定实体的DbEntityEntry对象,这个DbEntityEntry对象提供有关实体实例的各种信息,我们也可以使用DbEntityEntry对象来操作实体。最重要的是,我们可以通过DbEntityEntry对象的state属性来指定实体的EntityState如下所示:
context.Entry(entity).state = EntityState.Added/Modified/Deleted
一个栗子:
var student = new Student() { //Root entity (无主键值)
StudentName = "Bill",
StandardId = ,
Standard = new Standard() //Child entity (有主键值)
{
StandardId = ,
StandardName = "Grade 1"
},
Courses = new List<Course>() {
new Course(){ CourseName = "Machine Language" }, //Child entity (无主键值)
new Course(){ CourseId = } //Child entity (有主键值)
}
};
using (var context = new SchoolDBEntities())
{
context.Entry(student).State = EntityState.Added;
//context.ChangeTracker.Entities返回context追踪的所有EntityEntry实例
foreach (var entity in context.ChangeTracker.Entries()){
Console.WriteLine("{0}: {1}", entity.Entity.GetType().Name, entity.State);
}
}
//-----输出:
Student: Added
Standard: Added
Course: Added
Course: Added
在上边的栗子中,Student实体图集包含了Standard和Course实体, context.Entry(student).State = EntityState.Added; 将父实体和子实体(无论有没有主键值)的EntityState都设置成Added,所以我们要谨慎使用Entry()方法。
下表说明Entry()方法的规则
| 父实体 | 子实体 |
|---|---|
| Added | Added |
| Modified | Unchanged |
| Deleted | All child entities will be null |
2.DbSet.Add()
DbSet.Add()方法将整个实体图集附加到上下文中,同时把父实体和子实体的状态都设置成Added
一个栗子:
//离线实体图集
Student disconnectedStudent = new Student() { StudentName = "New Student" };
disconnectedStudent.StudentAddress = new StudentAddress() { Address1 = "Address", City = "City1" }; using (var context = new SchoolDBEntities())
{
context.Students.Add(disconnectedStudent); // 获取EntityEntry实例用于查看实体的状态
var studentEntry = context.Entry(disconnectedStudent);
var addressEntry = context.Entry(disconnectedStudent.StudentAddress); Console.WriteLine("Student: {0}", studentEntry.State);
Console.WriteLine("StudentAddress: {0}", addressEntry.State);
}
//输出
Student: Added
StudentAddress: Added
Dbset.Add()方法附加整个实体图集到上下文中,所有实体的状态都是Added,执行SaveChange()方法时会执行Insert操作,在数据库添加新记录。
3.DbSet.Attach()
DbSet.Attach()方法将实体图集附加到一个新的上下文中,每个实体的状态都是Unchanged.
一个栗子:
//离线实体图集
Student disconnectedStudent = new Student() { StudentName = "New Student" };
disconnectedStudent.StudentAddress = new StudentAddress() { Address1 = "Address", City = "City1" }; using (var context = new SchoolDBEntities())
{
context.Students.Attach(disconnectedStudent); // 获取EntityEntry实例用于查看实体的状态
var studentEntry = context.Entry(disconnectedStudent);
var addressEntry = context.Entry(disconnectedStudent.StudentAddress); Console.WriteLine("Student: {0}",studentEntry.State);
Console.WriteLine("StudentAddress: {0}",addressEntry.State);
}
//----输出
Student: Unchanged
StudentAddress: Unchanged
EF系列目录链接:Entity Franmework系列教程汇总
Entity Framework入门教程(9)---离线场景附加实体图集到上下文的更多相关文章
- Entity Framework入门教程(15)---DbContext追踪实体状态改变
这一节介绍DbContext追踪实体的变化.EF支持DbContext在其生命周期中自动追踪加载的实体.我们可以通过DbChangeTracker类获取DbContext追踪的所有实体的变化. 注意每 ...
- Entity Framework入门教程(10)---离线场景保存和删除实体/实体图集
离线场景保存和删除实体/实体图集 这一节的内容是在离线场景中保存实体和实体图集 在离线场景中,当我们保存一个离线的实体图集或一个单独的离线实体时,我们需要做两件事.首先,我们要把实体附加到新的上下文中 ...
- Entity Framework入门教程(5)---EF中的持久化场景
EF中的持久性场景 使用EF实现实体持久化(保存)到数据库有两种情况:在线场景和离线场景. 1.在线场景 在线场景中,context是同一个上下文实例(从DbContext派生),检索和保存实体都通过 ...
- Entity Framework入门教程(6)--- 在线场景中保存数据
在线场景中保存数据 在线场景中保存实体数据是一项相当容易的任务,因为使用的是同一个context,这个context会自动跟踪所有实体发生的更改. 下图说明了在线场景中的CUD(创建,更新,删除)操作 ...
- Entity Framework入门教程:什么是Entity Framework
Entity Framework简介 Entity Framework是微软提供的一个O/RM(对象关系映射)框架.它基于ADO.NET,为开发人员提供了一种自动化的机制来访问和存储数据库中的数据. ...
- Entity Framework入门教程(1)---Entity Framework简介
什么是Entity Framework 学习EF的前提:熟练使用Linq和Ado.net,因为在使用EF框架进行开发时,我们大多数情况使用Linq进行查询和操作,而EF的底层实现用的是Ado.net. ...
- ASP .NET MVC 之Entity Framework入门教程及源码
本文主要的目的是 1. 说明Entity Framework Power Tools如何使用. 2. Entity Framework 快速门 实验环境: OS: Windows Server 20 ...
- Entity Framework入门教程:SQLite数据源访问
[环境安装] 可以通过NuGet直接搜索安装SQLite需要用到的组件 或者直接使用程序包管理器控制台 > Install-Package System.Data.SQLite 通过ADO.NE ...
- Entity Framework入门教程: Entity Framework支持的查询方式
Entity Framework支持的查询方式有三种 LINQ to Entities Entity SQL Native SQL [LINQ to Entities] LINQ(语言集成查询)是从V ...
随机推荐
- Swift代理的使用
Swift代理的使用 协议规定了用来实现某一特定功能所必需的方法和属性. 任意能够满足协议要求的类型被称为遵循(conform)这个协议. 类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议 ...
- Eclipse启动报错,解决办法
打开log日志,发现如下错误.原因是修改了计算机用户名导致 !SESSION Thu Aug 30 08:55:41 CST 2018 -------------------------------- ...
- Json多层对象访问
背景说明 本文主要记录演示,利用Gson工具,对多层的 Json 数据进行转换读取的示例.原始 Json 字符串格式化效果如下: 示例代码 import java.util.Iterator; imp ...
- mmap:速度快+整块操作
mmap使得可以将设备内存映射到用户空间,从而使得用户程序获得访问硬件的能力,mmap的动作需要由内核中的驱动来实现.在使用mmap映射后,用户程序对给定范围的内存的读写就变成了对设备内存的读写,也就 ...
- html5 contenteditable 实现table可编辑(网页版EXCEL)
一直想找一个免费的网页版的EXCEL插件,以便于多人共同在线编辑,始终没发现合适的. 其实自己实现类似功能也不难.参考:https://blog.csdn.net/chadcao/article/de ...
- 基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)
基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势) 前言 前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候 ...
- 在Unity使文字变色
using UnityEngine;using System.Collections;using UnityEngine.UI; public class ShipIntro : MonoBehavi ...
- 父进程结束,其子进程不会结束,会挂到init进程下
结论:一个父进程产生子进程,父进程结束(kill),子进程不会结束,子进程被init进程托管 下面是过程: d.sh脚本是一个ping命令,执行d.sh 目前,103310 进程为父进程,103344 ...
- Flask中使用数据库连接池 DBUtils ——(4)
DBUtils是Python的一个用于实现数据库连接池的模块. 此连接池有两种连接模式: 模式一:为每个线程创建一个连接,线程即使调用了close方法,也不会关闭,只是把连接重新放到连接池,供自己线程 ...
- Solving the Top ERP and CRM Metadata Challenges with erwin & Silwood
Registrationhttps://register.gotowebinar.com/register/3486582555108619010 Solving the Top ERP and CR ...