关闭状态跟踪
默认情况下查询的实体是有状态跟踪的,即实体中包含了实体的状态、记录跟踪属性变更的字典,以及 Lazy 加载的管理器。使用 AsNoTracing 扩展查询可以使输出的对象更轻量化,但此时你将无法再获取或变更实体的状态。
以下的示例是默认使用状态跟踪的:
[TestMethod]
public void TestAsHasTracking()
{
using (var db = new DbContext())
{
var result = db.Customers.FirstOrDefault(s => s.CustomerID == "ALFKI");
result.City = "kunming";
result.CompanyName = "fireasy";
var modifiedPropeties = result.GetModifiedProperties();
Assert.AreEqual(2, modifiedPropeties.Length);
Assert.AreEqual("Berlin", result.GetOldValue("City"));
}
}
使用 AsNoTracking 方法后,对比上面的示例,你就能看到两者的差异了。
[TestMethod]
public void TestAsNoTracking()
{
using (var db = new DbContext())
{
var result = db.Customers.AsNoTracking().FirstOrDefault(s => s.CustomerID == "ALFKI");
result.City = "kunming";
result.CompanyName = "fireasy";
var modifiedPropeties = result.GetModifiedProperties();
Assert.AreEqual(0, modifiedPropeties.Length);
Assert.AreEqual(PropertyValue.Empty, result.GetOldValue("City"));
}
}