作为 Entity Framework Code First 测试的一部分,我正在测试更改跟踪。在一个小型测试数据库中,我在一个表中有两辆汽车,我对其运行测试方法:
Debug.WriteLine("Reading cars...");
var cars = context.Cars.ToArray();
Debug.WriteLine("Updating top speed of first car...");
Debug.WriteLine(string.Format("Type of car[0] is {0}", cars[0].GetType().ToString()));
cars[0].TopSpeed = 260;
Debug.WriteLine("Saving changes...");
context.SaveChanges();
我已将跟踪输出添加到类的TopSpeed
和Brand
属性的 getter 和 setter 中,Car
以查看它们是如何被访问的。TopSpeed
是一个int?
并且Brand
是Brand
实体的导航属性。运行上面的代码会得到下面的输出。
读车... 将 ABC123 的 TopSpeed 设置为 210。 汽车:为 ABC123 获得 TopSpeed。 将 XYZ987 的 TopSpeed 设置为 250。 汽车:为 XYZ987 获得 TopSpeed。 正在更新第一辆车的最高速度... 汽车类型 [0] 是 System.Data.Entity.DynamicProxies.Car_18E3E11297DC48759312BDF1C2FFEBE9F19BAE5D487CED2A9781A6CA730071EA 将 ABC123 的 TopSpeed 设置为 260。 正在保存更改... 汽车:为 ABC123 获得品牌。 汽车:为 XYZ987 获得品牌。 汽车:为 ABC123 获得 TopSpeed。 汽车:为 ABC123 获得 TopSpeed。 汽车:为 XYZ987 获得 TopSpeed。 汽车:为 ABC123 获得 TopSpeed。 汽车:为 ABC123 获得 TopSpeed。 汽车:为 ABC123 获得 TopSpeed。 汽车:为 ABC123 获得 TopSpeed。 汽车:为 ABC123 获得 TopSpeed。
对象的类型是用于更改跟踪的 EF 动态代理。尽管如此,当调用SaveChanges()
未更改的 XYZ987 汽车的属性时,仍会被读取。我认为更改跟踪会导致 EF 仅读取已知更改的对象,还是我遗漏了什么?我还需要添加其他内容以启用更改跟踪吗?