【问题标题】:Does ObjectContext keep track of already fetched entities when refetching themObjectContext 是否在重新获取实体时跟踪已获取的实体
【发布时间】:2011-07-21 08:06:22
【问题描述】:
  1. 我从数据库中获取对象(带有代理的 POCO 对象)
  2. 我修改了它的属性而不保存更改
  3. 稍后我会再次从数据库中获取它(我使用相同的对象上下文)
  4. 房产的价值是多少?

例如,如果我有集合用户的对象上下文,那么以下结果是什么:

ObjectContext o = ....;
User u = o.Users.First(u=>u.Id == 1);
Console.WriteLine(u.LastName); // I get 'test' for example
u.LastName = 'SomethingElse';
u  = o.Users.First(u=>u.Id == 1);
Console.WriteLine(u.LastName); // What is the result??

如果最后一条语句的结果不是字符串“SomethingElse”,那么有没有办法实现这个功能?

【问题讨论】:

    标签: .net linq entity-framework-4


    【解决方案1】:

    这就是称为identity map pattern 的ORM 工具的核心功能。具有唯一键的实体在每个上下文中只能实现一次,因此第二个查询将默认使用相同的实例而不更改其值。

    您可以通过以下任一方式强制查询刷新值:

    ObjectContext o = ....;
    User u = o.Users.First(u=>u.Id == 1);
    Console.WriteLine(u.LastName); // I get 'test' for example
    u.LastName = 'SomethingElse';
    o.Users.MergeOption = MergeOption.OverwriteChagnes; // Here you change the behavior
    u  = o.Users.First(u=>u.Id == 1);
    Console.WriteLine(u.LastName); // result is 'test' again
    

    或通过重新加载实体本身:

    ObjectContext o = ....;
    User u = o.Users.First(u=>u.Id == 1);
    Console.WriteLine(u.LastName); // I get 'test' for example
    u.LastName = 'SomethingElse';
    o.Refresh(RefreshMode.StoreWins, u); // Here you reload entity with values from the database
    Console.WriteLine(u.LastName); // result is 'test' again    
    

    【讨论】:

      【解决方案2】:

      是的,如果它看到从数据库返回相同的记录身份,则有一个身份管理器会返回相同的对象

      因此,结果应该是"SomethingElse",除非您禁用身份管理器。

      【讨论】:

      • 或使用Detach...(我必须这样做,特别是在 POST 之后,当我需要触发器生成的 slug 时)
      猜你喜欢
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2014-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多