在本章中,让我们看看如何更改未被上下文跟踪的实体.未被上下文跟踪的实体称为"断开连接"实体.
对于大多数单层应用程序,如果用户界面和数据库访问层在同一个应用程序进程中运行,您可能只是对上下文跟踪的实体执行操作.
断开连接的实体的操作在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): 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...