如何强制EF Code First查询数据库?

mat*_*wen 7 entity-framework-4 ef-code-first

我有一个站点管理一组规则和一个单独的Windows窗体应用程序,根据数据库中的规则进行文件级别更改.

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

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

我知道我可能会采用这种错误方式,并且应该通过JSON/REST从站点到表单应用程序进行某种数据访问,但我不想出于其他原因.

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

Lad*_*nka 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;    
Run Code Online (Sandbox Code Playgroud)

或者更简单的场景:如果可能的话,使用更好的上下文管理,而不是在相同的上下文中运行查询我们新的.

顺便说一句.在winform应用程序中公开服务并由网站使用它的想法是错误的.您需要第三个服务应用程序(在Web服务器上托管或作为Windows服务),网站和winform应用程序都将通过该新应用程序访问数据库.EF只会在新的应用程序中.

编辑:

如果您的WinForm应用程序不对从数据库加载的数据进行更改,您也可以使用:

var query = from x context.YourEntities.AsNoTracking() where ... select x;
Run Code Online (Sandbox Code Playgroud)

这将关闭实体的内部更改跟踪,它还应该强制EF每次重新加载实体,但它会使更改更容易保存更改.