关闭状态跟踪


  默认情况下查询的实体是有状态跟踪的,即实体中包含了实体的状态、记录跟踪属性变更的字典,以及 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"));
    }
}