
- 实体框架教程
- 实体框架 - 首页
- 实体框架 - 概述
- 实体框架 - 架构
- 实体框架 - 环境设置
- 实体框架 - 数据库设置
- 实体框架 - 数据模型
- 实体框架 - DbContext
- 实体框架 - 类型
- 实体框架 - 关系
- 实体框架 - 生命周期
- 实体框架 - 代码优先方法
- 实体框架 - 模型优先方法
- 实体框架 - 数据库优先方法
- 实体框架 - 开发方法
- 实体框架 - 数据库操作
- 实体框架 - 并发
- 实体框架 - 事务
- 实体框架 - 视图
- 实体框架 - 索引
- 实体框架 - 存储过程
- 实体框架 - 断开连接的实体
- 实体框架 - 表值函数
- 实体框架 - 本机SQL
- 实体框架 - 枚举支持
- 实体框架 - 异步查询
- 实体框架 - 持久化
- 实体框架 - 投影查询
- 实体框架 - 命令日志
- 实体框架 - 命令拦截
- 实体框架 - 空间数据类型
- 实体框架 - 继承
- 实体框架 - 迁移
- 实体框架 - 渴望加载
- 实体框架 - 延迟加载
- 实体框架 - 显式加载
- 实体框架 - 验证
- 实体框架 - 跟踪更改
- 实体框架 - 彩色实体
- 实体框架 - 代码优先方法
- 实体框架 - 第一个示例
- 实体框架 - 数据注释
- 实体框架 - Fluent API
- 实体框架 - 种子数据库
- 实体框架 - 代码优先迁移
- 实体框架 - 多个DbContext
- 实体框架 - 嵌套实体类型
- 实体框架资源
- 实体框架 - 快速指南
- 实体框架 - 有用资源
- 实体框架 - 讨论
实体框架 - 断开连接的实体
在本章中,让我们看看如何对上下文未跟踪的实体进行更改。上下文未跟踪的实体被称为“断开连接”的实体。
对于大多数单层应用程序,其中用户界面和数据库访问层在同一个应用程序进程中运行,您可能只会对上下文正在跟踪的实体执行操作。
对断开连接的实体的操作在 N 层应用程序中更为常见。
N 层应用程序涉及在服务器上获取一些数据并将其通过网络返回到客户端机器。
然后,客户端应用程序操作这些数据,然后将其返回到服务器以进行持久化。
以下是需要对断开连接的实体图甚至单个断开连接的实体采取的两个步骤。
将实体附加到新的上下文实例,并使上下文了解这些实体。
手动为这些实体设置适当的 EntityStates。

让我们看一下以下代码,其中 Student 实体添加了两个 Enrollment 实体。
class Program { static void Main(string[] args) { var student = new Student { ID = 1001, FirstMidName = "Wasim", LastName = "Akram", EnrollmentDate = DateTime.Parse("2015-10-10"), Enrollments = new List<Enrollment> { new Enrollment{EnrollmentID = 2001,CourseID = 4022, StudentID = 1001 }, new Enrollment{EnrollmentID = 2002,CourseID = 4025, StudentID = 1001 }, } }; using (var context = new UniContextEntities()) { context.Students.Add(student); Console.WriteLine("New Student ({0} {1}): {2}", student.FirstMidName, student.LastName, context.Entry(student).State); foreach (var enrollment in student.Enrollments) { Console.WriteLine("Enrollment ID: {0} State: {1}", enrollment.EnrollmentID, context.Entry(enrollment).State); } Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } } }
代码构造了一个新的 Student 实例,该实例还在其 Enrollments 属性中引用了两个新的 Enrollment 实例。
然后,使用 Add 方法将新的 Student 添加到上下文中。
添加 Student 后,代码使用 DbContext.Entry 方法访问实体框架关于新 Student 的更改跟踪信息。
从这些更改跟踪信息中,State 属性用于输出实体的当前状态。
然后对从新 Student 引用的每个新创建的 Enrollments 重复此过程。如果运行应用程序,您将收到以下输出:
New Student (Wasim Akram): Added Enrollment ID: 2001 State: Added Enrollment ID: 2002 State: Added Press any key to exit...
DbSet.Add 用于告诉实体框架关于新实体,而 DbSet.Attach 用于告诉实体框架关于现有实体。Attach 方法会将实体标记为 Unchanged 状态。
让我们看一下以下 C# 代码,其中断开连接的实体附加到 DbContext。
class Program { static void Main(string[] args) { var student = new Student { ID = 1001, FirstMidName = "Wasim", LastName = "Akram", EnrollmentDate = DateTime.Parse("2015-10-10"), Enrollments = new List<Enrollment> { new Enrollment { EnrollmentID = 2001, CourseID = 4022, StudentID = 1001 }, new Enrollment { EnrollmentID = 2002, CourseID = 4025, StudentID = 1001 }, } }; using (var context = new UniContextEntities()) { context.Students.Attach(student); Console.WriteLine("New Student ({0} {1}): {2}", student.FirstMidName, student.LastName, context.Entry(student).State); foreach (var enrollment in student.Enrollments) { Console.WriteLine("Enrollment ID: {0} State: {1}", enrollment.EnrollmentID, context.Entry(enrollment).State); } Console.WriteLine("Press any key to exit..."); Console.ReadKey(); } } }
当使用 Attach() 方法执行上述代码时,您将收到以下输出。
New Student (Wasim Akram): Unchanged Enrollment ID: 2001 State: Unchanged Enrollment ID: 2002 State: Unchanged Press any key to exit...
广告