2011-10-05 105 views
7

我有一个站点管理一组规则和一个单独的Windows窗体应用程序,根据数据库中的规则进行文件级别更改。如何强制EF代码优先查询数据库?

这两个应用程序都对EF Code First DbContext使用相同的库,但每个应用程序都在实例化它们自己的上下文副本。

问题是,上下文的每个运行版本都不知道其他版本所做的更改。例如。如果我在网站上更改规则,表单应用程序仍然具有以前的版本。

我知道我可能会对此错误的方法,并应具有某种通过JSON/REST从网站上的表格应用程序数据访问,但我不希望其他原因。

有没有办法在上下文中“禁用缓存”,并强制每个查询命中数据库?

回答

10

不,没有办法禁用缓存。您必须手动将每个查询设置为reaload数据。该功能不适用于DbContext API =>您必须使用ObjectContext API。

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
ObjectSet<YourEntity> set = objectContext.CreateObjectSet<YourEntity>(); 
set.MergeOption = MergeOption.OverwriteChanges; 
var query = from x in set where ... select x;  

或者更简单的方案:如果可能的话,而不是在同样的背景下我们新的一个正在运行的查询使用更好的上下文管理。

Btw。在winform应用程序中暴露服务并通过网站使用服务的想法是错误的。您需要第三个服务应用程序(托管在Web服务器上或作为Windows服务),并且网站和winform应用程序都将通过该新应用程序访问数据库。 EF将只在新的应用程序中。

编辑:

如果您的WinForm应用程序不会更改从数据库加载数据你也可以使用这样的:

var query = from x context.YourEntities.AsNoTracking() where ... select x; 

这将关闭实体的内部变化跟踪,它也应该强制EF每次都会重新加载实体,但这会使存储更改变得更加困难。

+0

我喜欢简单的场景:)我现在有通过DI通过构造函数创建的存储库。我想我将不得不核实它并使用服务定位器根据需要生成新的上下文? – mattdwen

+0

比方说,“YourEntity”有相关的“用户”的实体,它们不与MegeOption.OverwriteChanges刷新,如何刷新YourEntity.Users也什么建议吗? –