工作上遇到个问题是关于系统后台数据库更新了某数据后, 前台界面刷新显示的不是最新的数据。但是大约10分后再次刷新就能显示新的数据,或者重启IIS等web server host。
最开始认为可能是因为前台获取数据有缓存, 数据是从缓存中直接获取的。
因为该系统使用的OData框架, 这个框架的内部机制是获取一次数据后, 就有一个数据缓存, 在一定时间内这个缓存不会失效, 然后这个时间段里如果想从DB中再次获取数据, 需要根据其初始化的DBContext在这里是Microsoft.OData.Client.DataServiceContext的merge option来判断获取的新数据都有哪些, 这个值默认是append, 所以后台更新的数据不属于其中, 则没有获取到,需要将merge option改成:
this.MergeOption = Microsoft.OData.Client.MergeOption.OverwriteChanges 即可。
// Summary:
// Gets or sets the synchronization option for receiving entities from a data service.
//
// Returns:
// One of the members of the Microsoft.OData.Client.MergeOption enumeration.
//
// Remarks:
// Used to specify a synchronization strategy when sending/receiving entities to/from
// a data service. This value is read by the deserialization component of the client
// prior to materializing objects. As such, it is recommended to set this property
// to the appropriate materialization strategy before executing any queries/updates
// to the data service. The default value is Microsoft.OData.Client.DataServiceContext.MergeOption.AppendOnly.
public MergeOption MergeOption { get; set; }
参考资料:
MSDN: Microsoft.OData.Client.DataServiceContext
https://stackoverflow.com/questions/14237362/does-microsoft-data-services-client-caches-data
https://blogs.msdn.microsoft.com/dsimmons/2010/01/12/ef-merge-options-and-compiled-queries/
https://blogs.msmvps.com/kevinmcneish/2010/02/16/setting-entity-framework-mergeoptions-what-works-what-doesn-t/
https://stackoverflow.com/questions/14237362/does-microsoft-data-services-client-caches-data