在本章中,让我们看看如何更改未被上下文跟踪的实体.未被上下文跟踪的实体称为"断开连接"实体.
对于大多数单层应用程序,如果用户界面和数据库访问层在同一个应用程序进程中运行,您可能只是对上下文跟踪的实体执行操作.
断开连接的实体的操作在N层应用程序中更为常见.
N层应用程序涉及在服务器上获取某些数据并通过网络返回客户端计算机.
客户端应用程序然后在将数据返回到要保留的服务器之前处理这些数据.
以下是断开连接的实体图甚至单个断开连接的实体需要采取的两个步骤.
使用新的上下文实例附加实体,并使这些实体知道上下文.
手动为这些实体设置适当的EntityStates.
让我们看一下以下代码,其中学生实体添加了两个注册实体.
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添加到上下文中.
添加学生后,代码使用DbContext.Entry方法访问Entity Framework关于新学生的变更跟踪信息.
根据此更改跟踪信息,State属性用于写出实体的当前状态.
然后对从新学生引用的每个新创建的注册重复此过程.如果您运行该应用程序,您将收到以下输出 :
New Student (Wasim Akram): AddedEnrollment ID: 2001 State: AddedEnrollment ID: 2002 State: AddedPress 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): UnchangedEnrollment ID: 2001 State: UnchangedEnrollment ID: 2002 State: UnchangedPress any key to exit...
免责声明:以上内容(如有图片或视频亦包括在内)有转载其他网站资源,如有侵权请联系删除
-
设计总结|如何更好地表达活动品牌?
-
谈谈“目标思维”的落地
编辑导读:我们在做数据分析之前,一定要搞清楚需求方的目标到底是什么,要根据目标来重新定义业务方提出的问题,这就是目标思维。目标思维有多重要呢?应该如何落地呢...
-
在线教育平台竞品分析:网易云课堂vs腾讯课堂
本文从移动端出发,对当前比较热门的两款在线教育平台软件-网易云课堂和腾讯课堂进行比较和分析,不足之处还请大家多提意见。 市场分析 随着国内互联网技术的发展和移...
-
即学即用|父亲节活动的4种运营策略
-
B端产品经理和体验设计师的工作职责边界梳理
-
豆果美食电商分支用户体验报告及建议
-
数据分析师如何提高工作效率
在我们的日常工作中,提高工作效率是每个岗位都需要实现的,在工作中,面对比较凌乱的事情时,首先我们需要梳理清楚,按重要级进行开展;本文作者分享了关于...
-
2016中国云计算SaaS移动办公平台年度综合报告
-
网易大布局教育事业:网易公开课、网易云课堂和MOOC分析
-
一篇文章搞懂语音交互的来龙去脉