- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我看到有很多关于 EF 缓存的问题,但我还没有找到解决问题的方法。
如何完全禁用 Entity Framework 6 缓存?或者,我能否以编程方式告诉 EF 忘记缓存,因为数据发生了一些变化?
首先,我继承了一个应用程序,该应用程序由 EF(模型优先定义实体)和普通旧 SQL(操作数据)的奇怪组合组成。我所做的是重构应用程序,以便:
GetAll()
)DbContext.Database.Connection
需要时Spring.Web
支持启用 DI 和事务(尚未)目前,我已经重新组织了代码,以便应用程序的主要功能(在庞大的数据集上运行复杂的 SQL 查询)像以前一样工作,但随后使用 as 更智能地完成查找域实体操作尽可能多的 Entity Framework
我继承的其中一个页面是一个多复选框页面,为了更好地理解,我将向您展示。我不会讨论以前的实现者的选择,因为修复我当前的问题并在以后重构代码比阻止开发损坏的功能要便宜。
页面是这样的
基本上是 Controller
方法如下
[HttpPost]
public ActionResult Index(string[] codice, string[] flagpf, string[] flagpg, string[] flagammbce, string[] flagammdiv, string[] flagammest,
string[] flagintab, string[] flagfinanz, string[] flagita, string[] flagest, string pNew){
Sottogruppo2015Manager.ActivateFlagFor("pf", flagpf);
Sottogruppo2015Manager.ActivateFlagFor("pg", flagpg);
Sottogruppo2015Manager.ActivateFlagFor("ammbce", flagammbce);
Sottogruppo2015Manager.ActivateFlagFor("ammdiv", flagammdiv);
Sottogruppo2015Manager.ActivateFlagFor("ammest", flagammest);
Sottogruppo2015Manager.ActivateFlagFor("intab", flagintab);
Sottogruppo2015Manager.ActivateFlagFor("finanz", flagfinanz);
Sottogruppo2015Manager.ActivateFlagFor("ita", flagita);
Sottogruppo2015Manager.ActivateFlagFor("est", flagest);
return RedirectToAction("Index", new { pNew });
}
每个string[]
参数是表中的一列。 ActivateFlagFor
方法按顺序运行两个查询
UPDATE table SET --param1-- = 0;
UPDATE table SET --param1-- = 1 where id in (--param2--)
行为如下:
我确定这是缓存问题,因为重新加载应用程序可以解决问题。由于应用程序的主要功能完全基于 SQL,因此对查找表的更改会反射(reflect)到主要操作中,这是正确的行为。
我知道 EF 缓存是一个非常好的性能特性,但在我的情况下我只是不想使用它,至少在我将整个应用程序迁移到 LINQ DML 之前(可能是不可能的)。
DbContext
当然你们中的一些人可能会问“你如何使用你的 DbContext?” “你处理得当吗?”。
I<Entity>Manager
扩展 BaseManager
DbContext
是一个请求范围的 Spring 对象。我已经asked about disposing request-scoped objects但我目前实现了一个解决方法,虽然不好,但在请求结束时正确处理 DbContext。public class ExampleManagerImpl : BaseManager, IExampleManager
{
public void ActivateFlagFor(string aFlag, string[] aList)
{
string sql = "UPDATE table SET flag" + aFlag + " = 0";
RunStatementV1(sql);
if (aList != null && aList.Any())
{
sql = "UPDATE table SET flag" + aFlag + " = 1 WHERE id in (" + aList.ToCsvApex() + ")";
RunStatementV1(sql);
}
}
public IList<Models.Example> GetAll()
{
return DataContext.example.ToList(); //I don't dispose of the DataContext willingly
}
}
和
public abstract class BaseManager {
public DbContext DataContext { get; set; } //Autowired
protected void RunStatementV1(string aSqlStatement)
{
IDbConnection connection = DataContext.Database.Connection;
if (connection.State == ConnectionState.Closed || connection.State == ConnectionState.Broken) connection.Open(); //Needed because sometimes I found the connection closed, even if I don't dispose of it
using (IDbCommand command = connection.CreateCommand())
{
command.CommandText = aSqlStatement;
command.ExecuteNonQuery();
}
}
}
Detach
似乎解决了这个问题,但我需要将它应用于许多实体,以便在将来的某一天恢复最佳答案
如果您想完全忽略 EF6 的数据检索缓存,请将 AsNoTracking()
添加到查询的末尾(在调用 ToList()
或执行任何其他操作之前)这将执行查询。
请注意,这样做既不会检查现有数据的缓存,也不会将数据库调用的结果添加到缓存中。此外, Entity Framework 不会自动检测您从数据库中检索到的实体的更改。如果您确实想要更改任何实体并将它们保存回数据库,则需要在调用 SaveChanges()
之前附加更改的实体。
您的方法目前是:
public IList<Models.Example> GetAll()
{
return DataContext.example.ToList();
}
它会变成:
public IList<Models.Example> GetAll()
{
return DataContext.example.AsNoTracking().ToList();
}
如果您对处理 EF 缓存的其他选项感兴趣,我写了一个 blog post about EF6 Cache Busting .
关于c# - 使 Entity Framework 缓存失效/禁用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28233406/
在Java编程中,使用private关键字修饰了某个成员,只有这个成员所在的类和这个类的方法可以使用,其他的类都无法访问到这个private成员。 上面描述了private修饰符的基本职能,今天来
我是 JWT 的新手,想知道当用户退出应用程序时是否可以在服务器端使 JWT 失效/作废(我也想知道它是否有意义 这样做!)。思路是: 用户点击其应用中的注销链接 应用调用 POST https://
是否有可能使特定操作的 PageCache 无效或删除。 考虑一下: class SiteController extends Controller { public function beh
我使用的是 XCode 9,OSX 而不是 iOS,Objective-C。 我有一个 XPC 服务可以与其他应用程序通信。 XPC 服务对我来说是全新的。我已经阅读了我找到的文档和文章 - 我仍然需
我有一个带有 NSTimer 的 iPhone 应用程序,名为 pressTimer,每当有人触摸此按钮时,该应用程序就会关闭。问题是他们经常触摸按钮,我希望计时器在他们抬起手指时停止。因此,我在 .
session 失效意味着 session 销毁。所以如果 session 被销毁,则表明服务器无法识别之前访问过的客户端。因此现在它为该客户端创建一个新的 session ID。 这是正确的吗?如果
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在尝试缓存 WebClient 返回的 Mono 时遇到问题。代码是这样的: public Mono authenticate() { return cachedTokenMono = ca
我知道通过在 DD-web.xml 文件中设置超时期限来使 session 失效,但我想知道如何以编程方式使 session 失效? 最佳答案 不确定你是否用java编程,但是部署描述符web.xml
我在 2 个不同的服务器上有 2 个应用程序 - Tomcat(基本上是一个 .WAR 文件)和一个在 jBoss 中的 EAR。 EAR 是一个可重复使用的应用程序,我将在其中对用户进行身份验证并将
self.timerProgress=[NSTimer scheduledTimerWithTimeInterval:50.0 target:self selector:@selector(stopP
在我的应用程序中,我应该使用多个计时器,但我不想为每个函数添加单独的计时器,我如何创建一个函数来简化创建多个计时器的过程,我尝试了下面的这段代码,它可以工作,但我不能使计时器无效。 import UI
我在 Swift 中做了一个练习项目来学习 NSTimer 是如何工作的。一键启动定时器,一键取消定时器。当我点击每个按钮一次时它工作正常。但是,当我多次点击开始计时器按钮时,我无法再使其无效。 这是
我在清理事件时遇到一个问题。当我从应用程序注销时,我可以执行清理事件以及 session.invalidate()。但是,当我关闭浏览器选项卡或关闭浏览器时,我无法进行干净的事件。我已经为此阅读了很多
我在 7.1.1 的 Google Pixel 设备上进行测试,发现当所有指纹从设备上移除时,我的私钥并未失效。我已经按照演示应用程序使用单个对称 SecretKey 进行了测试并且按预期工作,但是使
我正在 Tomcat 中运行一个 J2EE Web 应用程序,最近我的任务是向该应用程序添加指标。我正在使用 SessionListener 来检测 session 何时被销毁,然后将指标上传到数据库
我通过右键单击项目 -> 应用程序 -> 程序集信息 -> 标题修改了我的 C# 应用程序名称。 如果应用程序已经安装,则它不会更新名称,因为它正在从未刷新的 MUICache 中提取应用程序名称。
我正在使用 AssetsLibrary 框架将 Assets 保存到特定相册 (ALAssetsGroup)。 由于我经常使用 ALAssetsGroup(用于我想保存 Assets 的专辑),我认为
我的应用程序中有 4 个 NSTimers 对象,它们每隔几秒就会向一个 rest URL 发出请求。 点击一个特定的按钮我想停止计时器,这样它就停止轮询,点击另一个按钮我想恢复轮询。 我已经为所有计
我正在开发一个使用 JWT token 身份验证的 API。我在其背后创建了一些逻辑来使用验证码等更改用户密码。 一切正常,密码已更改。但这里有一个问题:即使用户密码已更改并且我在验证时获得了新的 J
我是一名优秀的程序员,十分优秀!