数据库上下文对象维护内存中的对象与数据库中数据行之间的同步。这些信息在调用 SaveChanges方法被调用的时候使用。例如,当使用 Add 方法传递一个新的实体对象时,实体的状态被设置为 Added,在调用 SaveChanges方法的时候,数据库上下文使用 SQL 命令 Insert来插入数据。
实体的状态可能为如下之一:
- Added. 实体在数据库中不存在。SaveChanges 方法必须执行 Insert 命令
- Unchanged. 在调用 SaveChanges 的时候不需要做任何事情,当从数据库读取数据的时候,实体处于此状态。
- Modified. 某些或者全部的实体属性被修改过. SaveChanges方法需要执行 Update 命令。
- Deleted. 实体标记为已删除,SaveChanges 方法必须执行 Delete 命令。
- Detached. 实体的状态没有被数据库上下文管理。
在桌面应用程序和Web应用程序中的运行
在桌面应用中,实体的状态改变典型地自动完成。在这种类型的应用中,你读取一个实体,然后修改某些属性的值,这使得实体的状态被自动修改为 Modified。然后,在调用SaveChanged 的时候,实体框架生成 Update 命令进行更新,只有你修改的实际属性被更新。
但是,在 Web 应用程序中,这个处理序列不是连续的。因为数据库上下文读取的实体对象实例在页面被呈现之后被丢弃了。当 HttpPost Edit 方法被调用的时候,导致一个新的请求和一个新的数据库上下文对象被生成,所以,你必须手工设置实体的状态为 Modified。然后调用 SaveChanges 方法,实体框架更新数据库中数据行的所有列,因为数据库上下文没有办法知道你修改了哪些属性。