我有一个网站管理一系列规则和一个单独的Windows表单应用程序,根据数据库中的规则进行文件级别更改。
这两个应用程序对EF Code First DbContext使用相同的库,但每个应用程序都在实例化它们自己的上下文副本。
问题是,上下文的每个运行版本都不知道其他版本所做的更改。例如。如果我在网站上更改规则,则表单应用仍然具有以前的版本。
我知道我可能会采用这种错误方式,并且应该通过JSON / REST从站点到表单应用程序进行某种数据访问,但我不希望出于其他原因。
有没有办法在上下文中“禁用缓存”并强制每个查询命中数据库?
答案 0 :(得分: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;
或更简单的场景:如果可能的话,使用更好的上下文管理,而不是在相同的上下文中运行查询我们新的。
顺便说一下。在winform应用程序中公开服务并由网站使用它的想法是错误的。您需要第三个服务应用程序(在Web服务器上托管或作为Windows服务),网站和winform应用程序都将通过该新应用程序访问数据库。 EF只会出现在新的应用程序中。
编辑:
如果您的WinForm应用程序没有对从数据库加载的数据进行更改,您也可以使用:
var query = from x context.YourEntities.AsNoTracking() where ... select x;
这将关闭实体的内部更改跟踪,并且它还应该强制EF每次重新加载实体,但它会更加难以保存更改。