更改跟踪在实体框架中的工作方式
本文关键字:工作 方式 框架 实体 跟踪 | 更新日期: 2023-09-27 18:32:34
给定以下代码,EF/DbContext 如何知道对客户对象所做的更改:
class Program
{
static void Main()
{
using(var shopContext = new ShopContext())
{
var customer = shopContext.Customers.Find(7);
customer.City = "Marion";
customer.State = "Indiana";
shopContext.SaveChanges();
}
}
}
public class ShopContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
}
public class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string City { get; set; }
public string State { get; set; }
}
谢谢
当您从上下文加载实体时,它会保留一个额外的数据结构 - 我们称之为条目。该条目包含两组值 - 原始值和当前值。执行SaveChanges
操作时,EF 将遍历客户实体并更新条目中的当前值,以便它们与实体的实际状态匹配 - 此操作称为检测更改。在 SQL 命令生成期间,EF 将比较当前值和原始值,并生成 SQL 更新语句以修改数据库中更改的值。 此操作称为快照更改跟踪 - EF 在条目中保留快照。
还有一种称为动态更改跟踪的替代方法,它将在将值分配给实体属性的同时修改条目中的当前值。动态更改跟踪具有特定的要求(例如必须virtual
实体中的所有属性(,因为它必须在运行时将类包装到动态代理。这曾经是首选方式,但由于复杂方案中的一些性能问题,快照更改跟踪目前应用作默认值。