EF框架学习(6)---EF中的在线场景保存数据
在线场景中保存数据
在线场景中保存实体数据是一项相当容易的任务,因为使用的是同一个context,这个context会自动跟踪所有实体发生的更改。
下图说明了在线场景中的CUD(创建,更新,删除)操作。
EF在调用context.SaveChange方法时,根据EntityState进行添加、修改或删除实体实例,并执行INSERT,UPDATE和DELETE语句。在线场景中,context跟踪所有实体的实例,EntityState无论何时创建,修改或删除实体,它都会自动为每个实体设置适当的实例。
1.插入数据
使用DbSet.Add方法将新实体添加到上下文(context),调用context.SaveChanges()方法时在数据库中插入新记录。
using (var context = new SchoolDBEntities()) { var std = new Student() { FirstName = "Bill", LastName = "Gates" }; context.Students.Add(std); context.SaveChanges(); }
在上面的示例中,context.Students.Add(std)将新创建的Student实体实例,这个新实例的EntityState 为Added。调用context.SaveChanges()方法时数据库构建并执行以下INSERT语句。
exec sp_executesql N'INSERT [dbo].[Students]([FirstName], [LastName]) VALUES (@0, @1) SELECT [StudentId] FROM [dbo].[Students] WHERE @@ROWCOUNT > 0 AND [StudentId] = scope_identity()',N ''@0 nvarchar(max) ,@1 nvarchar(max) ',@0=N'Bill',@1=N'Gates' go
2.更新数据
在线场景中,EF API会跟踪上下文中所有实体。因此,在编辑实体数据时,EF会自动标记EntityState为Modified,在调用SaveChanges()方法时在数据库中生成并执行更新的语句。
using (var context = new SchoolDBEntities()) { var std = context.Students.First<Student>(); std.FirstName = "Steve"; context.SaveChanges(); }
我们使用从数据库中检索第一个学生:context.Students.First<student>()。一旦我们修改了FirstName,上下文就会将实例的EntityState设置为Modified。当我们调用该SaveChanges()方法时,会在数据库中构建并执行以下Update语句。
exec sp_executesql N'UPDATE [dbo].[Students] SET [FirstName] = @0 WHERE ([StudentId] = @1)', N'@0 nvarchar(max) ,@1 int',@0=N'Steve',@1=2 Go
在更新语句中,EF API通过主键找到要修改的实例,修改时仅包含修改的属性,其他属性将被忽略。在上面的示例中,仅FirstName编辑了属性,因此update语句中只包含FirstName列。
3.删除数据
DbSet.Remove()方法用于删除数据库表中的记录。
using (var context = new SchoolDBEntities()) { var std = context.Students.First<Student>(); context.Students.Remove(std); context.SaveChanges(); }
context.Students.Remove(std)将std实体对象标记为Deleted。因此,EF将在数据库中构建并执行以下DELETE语句。
exec sp_executesql N'DELETE [dbo].[Students] WHERE ([StudentId] = @0)',N'@0 int',@0=1 Go
通过上边的例子可以看出,在线场景中添加,更新或删除中的数据非常容易。