EF 6 DB-First系列--在连接场景下保存数据

本文介绍了在EntityFramework中,特别是在连接场景下如何进行数据的CRUD操作,包括如何通过DbContext跟踪实体状态并自动执行INSERT、UPDATE和DELETE语句。
摘要由CSDN通过智能技术生成

在连接场景下保存数据

在连接的场景中保存实体数据是一项相当简单的任务,因为上下文会自动跟踪实体在其生命周期内发生的更改。

所谓连接场景是指: 被纳入EF的DbContext上下文管理范围内的实体类,即DbContext可以跟踪其各种改变的状态。

在这里,我们将使用在创建实体数据模型章节中创建的相同的EDM进行CRUD操作。在其标量属性中包含数据的实体将根据其EntityState被插入、更新或删除。

在Entity Framework中,有两种持久化场景用于保存实体数据:连接和断开连接。在连接的场景中,在检索和保存实体时使用相同的DbContext实例,而在断开连接的场景中则不同。在本章中,您将学习如何在连接场景下保存数据。

下图为对接场景下的CUD(创建、更新、删除)操作。

在这里插入图片描述

如上图所示,当调用DbContext.SaveChanges()方法时,Entity Framework为其EntityState被添加、修改或删除的实体构建并执行INSERT、UPDATE和DELETE语句。在连接场景中,DbContext的实例跟踪所有实体,因此,每当创建、修改或删除实体时,它自动为每个实体设置适当的EntityState。

Insert Data(新增数据)

使用DbSet.Add方法将一个新实体添加到上下文(DbContext的实例),当您调用SaveChanges()方法时,该上下文将在数据库中插入一条新记录。

using (var context = new SchoolDBEntities())
{
    var std = new Student()
    {
        FirstName = "Bill",
        LastName = "Gates"
};

    context.Students.Add(std); //将实体添加到DbSet集合中,使得DbContext对该实体标记为Added状态并进行跟踪

    context.SaveChanges(); //根据实体标记的Added状态而向数据库执行insert语句
}

在上面的例子中,context.Students.Add(std)将新创建的Student实体实例添加到具有Added EntityState的上下文中。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

Updating Data(修改数据)

在连接场景中,EF API跟踪使用上下文检索的所有实体。因此,在编辑实体数据时,EF自动将EntityState标记为Modified,从而在调用SaveChanges()方法时在数据库中生成一条更新的语句。

using (var context = new SchoolDBEntities())
{
    var std = context.Students.First<Student>(); //更新数据时,实体必须是由DbContext上下文跟踪的实体
	std.FirstName = "Steve"; //修改由DbContext上下文跟踪的实体的属性值,此时DbContext上下文就会将该实体标记为Modified状态,并进行跟踪

    context.SaveChanges(); //根据实体标记的Modified状态而向数据库执行update语句
}

在上面的例子中,我们使用context.Students.First<student>()从数据库中检索第一个学生。只要我们修改了FirstName,上下文就会将它的EntityState设置为Modified,因为在DbContext实例(context)的范围内执行了修改。因此,当我们调用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属性,因此更新语句只包括FirstName列。

Deleting Data(删除数据)

使用DbSet.Remove()方法删除数据库表中的一条记录。

using (var context = new SchoolDBEntities())
{
	var std = context.Students.First<Student>(); //删除数据时,实体必须是由DbContext上下文跟踪的实体

    context.Students.Remove(std); //将实体从DbSet集合中删除,使得DbContext对该实体标记为Deleted状态并进行跟踪


    context.SaveChanges(); //根据实体标记的Deleted状态而向数据库执行delete语句
}

在上面的例子中,context.Students.Remove(std)将std实体对象标记为Deleted。因此,EF将在数据库中构建并执行以下DELETE语句。

exec sp_executesql N'DELETE [dbo].[Students]
WHERE ([StudentId] = @0)',N'@0 int',@0=1
Go

在连接场景中Entity Framework 6.x添加、更新或删除数据非常容易。

参考

https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值