例如,如果我有对象上下文与集合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”那么有没有办法实现这个功能呢?
答案 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"
。