ObjectContext是否在重新获取它们时跟踪已获取的实体

时间:2011-07-21 08:06:22

标签: .net linq entity-framework-4

  1. 我从数据库中获取对象(带代理的POCO对象)
  2. 我在不保存更改的情况下修改其属性
  3. 我稍后从数据库中获取它(我使用相同的对象上下文)
  4. 该物业的价值是多少?
  5. 例如,如果我有对象上下文与集合Users,那么以下结果是什么:

    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”那么有没有办法实现这个功能呢?

2 个答案:

答案 0 :(得分: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    

答案 1 :(得分:0)

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

因此,除非您禁用身份管理器,否则结果应为"SomethingElse"