【问题标题】:Why does EF Read my Unchanged Object on SaveChanges?为什么 EF 在 SaveChanges 上读取我未更改的对象?
【发布时间】:2012-02-27 10:02:57
【问题描述】:

作为 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();

我已将跟踪输出添加到Car 类的TopSpeedBrand 属性的getter 和setter,以查看它们是如何被访问的。 TopSpeedint?BrandBrand 实体的导航属性。运行上面的代码会得到下面的输出。

读车... 将 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 仅读取已知更改的对象,还是我遗漏了什么?是否需要添加其他内容才能启用更改跟踪?

【问题讨论】:

    标签: c# .net entity-framework entity-framework-4.3


    【解决方案1】:

    即使更改跟踪代理的所有要求都已满足,EF 仍会使用自动更改跟踪,除非明确关闭:

    context.Configuration.AutoDetectChangesEnabled = false;
    

    AutoDetectChangesEnabled 上的文档令人困惑:

    如果自动检测配置更改为真 启用;否则为假。

    查看 ADO.NET 的 blog 他们解释正确。

    【讨论】:

      【解决方案2】:

      在 .NET 4 上运行的 EF 4.1、4.2 和 4.3 中存在一个错误(或者更确切地说,缺乏优化),这会导致 DetectChanges 处理应该知道不需要更改跟踪的实体。这是因为在 .NET 4 上运行的 EF 不会跟踪是否有任何实体需要更改跟踪,因此每次都必须检查。

      在 .NET 4.5 上运行时,此问题已在 EF5 上得到修复,现在很快就会在测试版中提供。我刚刚验证了使用 .NET 4.5 上的 EF5,即使 AutoDetectChangesEnabled 设置为 true,也不会在 SaveChanges 中调用未更改的更改跟踪代理的属性的 getter。

      话虽如此,即使在 EF 4.1-4.3 上,我也不认为应该调用 getter,如果所有 EF 正在检查实体是否是更改跟踪代理,所以似乎可能还有另一个错误在这里。

      【讨论】:

        【解决方案3】:

        要启用动态更改跟踪,您需要将所有标量(非导航)属性设为虚拟。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-27
          • 2015-07-29
          • 1970-01-01
          • 1970-01-01
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多