当前位置:  开发笔记 > 编程语言 > 正文

实体框架:如果数据在上下文中,为什么数据库会被命中?

如何解决《实体框架:如果数据在上下文中,为什么数据库会被命中?》经验,为你挑选了1个好方法。

为什么要查找数据库以查找已在ObjectContext中表示的记录?

所以这就是我认为你查询时会发生的事情:

SiteUser someUser = context.SiteUser.Where(role => role.UserID == 1).ToList()[0];

垃圾示例,但我的想法是,我想从id为1的表中获取用户.现在假设这是第一次通过所以我猜测它必须在上下文中创建SiteUser列表,查询数据库,然后填写它的列表.使用分析器我看到这​​个:

SELECT 
 [Extent1].[UserID] AS [UserID], 
 [Extent1].[MainEmail] AS [MainEmail], 
 [Extent1].[Password] AS [Password], 
 [Extent1].[UserName] AS [UserName]
FROM [TIDBA].[TI_USER] AS [Extent1]
WHERE 1 = [Extent1].[UserID]

美丽.它完成了我所期望的并且在SiteUser列表中(如果我使用Watch挖得足够远)我可以看到在上下文SiteUser列表中有一个项目,它恰好是代表此数据行的水合对象.

接下来我想改变一些事情而不保存:

someUser.UserName = "HIHIHI";

现在说出于某种原因我想再次抓住它使用相同的上下文(这是一个奇怪的例子,但它实际上是一个测试,所以我可以证明这种情况发生):

someUser = context.SiteUser.Where(role => role.UserID == 1).ToList()[0];

我认为会发生的是它会查看上下文中的SiteUser列表,因为这就是生成的属性所说的内容.(如果不为null,则返回列表)然后它会查看它是否存在并返回它.没有数据库命中.猜猜是什么意思...

SELECT 
 [Extent1].[UserID] AS [UserID], 
 [Extent1].[MainEmail] AS [MainEmail], 
 [Extent1].[Password] AS [Password], 
 [Extent1].[UserName] AS [UserName]
FROM [TIDBA].[TI_USER] AS [Extent1]
WHERE 1 = [Extent1].[UserID]

人力资源管理.好的,所以我开始想,也许这是一个直觉检查,看看该数据项是否有任何变化,只更新我在客户端上没有更改的值的SiteUser对象.(类似于context.Refresh(RefreshMode.ClientWins,context.SiteUser))所以我把它停在了:

someUser = context.SiteUser.Where(role => role.UserID == 1).ToList()[0];

Line和I更改数据库中的值(密码列)并让它命中数据库.对象上没有任何变化.

这里的东西似乎不对.它命中数据库以选择我已经在上下文中已经水合的对象,但它不应用我在数据库中手动进行的更改.为什么它一直在击中数据库呢?

更新 感谢下面的一些链接,我能够挖掘一下并找到这个:

合并选项

看起来有一个枚举被设置为告诉如何处理负载.现在看完之后我看到了MergeOption.AppendOnly:

对象上下文中已存在的对象不从数据源加载.这是查询或在EntityCollection上调用Load方法的默认行为<(Of <(TEntity>)>).

这表明如果我在上下文中有它,那么数据库就不应该受到打击.但是,这似乎不是真的.如果OverwriteChanges或PreserveChanges是默认值,那将是有意义的,但它们不是.这似乎与应该发生的事情相矛盾.我唯一能想到的是"加载"只意味着没有覆盖.但是,这并不意味着没有对数据库的查询.



1> Craig Stuntz..:

context.SiteUser是ObjectQuery类型的属性.当您执行ObjectQuery时,它将始终命中后备存储.这就是他们所做的.如果您不想执行数据库查询,则不要使用ObjectQuery.

听起来你真正想要的是一个函数,它说:"如果实体已经在上下文中实现了,那么只需返回它.如果不是,那么就从数据库中获取它." 碰巧,ObjectContext包含一个名为GetObjectByKey的函数

GetObjectByKey尝试从ObjectStateManager检索具有指定EntityKey的对象.如果对象当前未加载到对象上下文中,则执行查询以尝试从数据源返回对象.

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有