- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个轻而易举的客户解决方案,其中向父实体显示其子列表。我们对某些子实体进行硬删除。现在,当用户是执行删除操作的用户时,没有问题,但是当其他用户执行操作时,似乎没有办法使已经加载到缓存中的子项失效。我们对父级执行一个新查询并扩展到子级,但是微风将它已经听说过的所有其他子级附加起来,即使数据库未返回它们也是如此。
我的问题:难道不应该轻而易举地意识到我们正在通过expand进行加载,从而在从db重新加载结果之前从缓存中完全删除所有子级吗?如果不是这种情况,我们还能怎么做呢?
谢谢
最佳答案
是的,这是一个非常好的观点。
删除仅仅是每项数据管理工作的一个可怕的麻烦。无论是否使用Breeze,这都是事实。它只会引起上下上下的心痛。这就是为什么我建议软删除而不是硬删除的原因。
但是您不在乎我的想法...所以我会继续。
让我直接说一下。 没有简单的方法可以正确实现来实现缓存清除方案。我将描述我们将如何做到(我确信某些细节被忽略了),您将明白为什么这样做很困难,在不正常的情况下却毫无结果。
当然,最有效,最强力的方法是在查询之前清空缓存。如果这样做,您可能还没有缓存,但我想我会提到它。
“独立”实体问题
在继续之前,请记住我刚刚提到的技术,并且如果您的UI(或其他任何东西)持有对您要删除的实体的引用,那么实际上所有可能的解决方案都是无用的。
哦,您可以将它们从缓存中删除。但是,无论现在保留对它们的引用,将继续对处于“已分离”状态的实体对象(幽灵)的引用。确保没有发生是您的责任;如果Breeze知道,它就不会知道,也不会做任何事情。
第二次尝试
第二种不太平淡的方法(由杰伊建议)是
var query = breeze.EntityQuery.from('TodoLists').expand('TodoItems');
var inCache = manager.executeQueryLocally(query);
inCache.slice().forEach(function(e) {
inCache = inCache.concat(e.TodoItems);
});
inCache.slice().forEach(function(e) {
manager.detachEntity(e);
});
inCache
列表。这次,请而不是从缓存中删除那些实体。查询成功后,我们将删除保留在此列表中的实体……但不是现在。 MergeOption
为“PreserveChanges”(默认情况下),请从inCache
列表(而不是从管理器的缓存中!)中删除所有有待更改的实体。我们这样做是因为无论服务器上实体的状态如何,此类实体都必须保留在缓存中。这就是“PreserveChanges”的意思。EntityManager.entityChanged
事件。在您的处理程序中,从inCache
列表中删除“已更改的实体”,因为该实体已由查询返回并合并到缓存中,这一事实表明它仍然存在于服务器上。这是一些代码:var handlerId = manager.entityChanged.subscribe(trackQueryResults);
function trackQueryResults(changeArgs) {
var action = changeArgs.entityAction;
if (action === breeze.EntityAction.AttachOnQuery ||
action === breeze.EntityAction.MergeOnQuery) {
var ix = inCache.indexOf(changeArgs.entity);
if (ix > -1) {
inCache.splice(ix, 1);
}
}
}
manager.entityChanged.unsubscribe(handlerId);
var handlerId = manager.entityChanged.subscribe(orphanDetector);
function orphanDetector(changeArgs) {
var action = changeArgs.entityAction;
if (action === breeze.EntityAction.PropertyChange) {
var orphan = changeArgs.entity;
// do something about this orphan
}
}
inCache
列表中的每个实体。inCache.slice().forEach(function(e) {
manager.detachEntity(e);
});
Products
,每个产品都有一个
Color
。其他一些用户讨厌“红色”。她删除了一些红色产品,并将其余的更改为“蓝色”。然后,她删除“红色”
Color
。
Colors
。 “红色”颜色消失了,您的清理过程将其与缓存分离。立即修改缓存中的每个
Product
。 Breeze不知道新的
Color
应该是什么,因此它将每个以前的“红色”产品的FK,
Product.colorId
设置为零。
Color
,因此所有这些产品都处于无效状态(违反了参照完整性约束)。他们没有
Color
父级。他们是孤儿。
PropertyChanged
事件。这就是我在代码示例中所做的。从理论上讲(我认为是“实际上”),在分离过程中唯一可能触发
PropertyChanged
事件的是“孤立”副作用。
colorId
吗? Color
。
Color
(“香蕉”)。
inCache
。然后,您的订户知道哪些实体必须从显示中删除...并可以做出适当的响应。
关于breeze - Breeze :子实体已被其他人删除后,在重新加载父实体后它们仍然出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22182101/
这个问题在这里已经有了答案: How does Scala's apply() method magic work? (3 个回答) 9年前关闭。 假设我在 scala 中有一个 MyList 类,其
这个问题在这里已经有了答案: What is a non-capturing group in regular expressions? (18 个回答) Reference - What does
这个问题是针对嵌入式系统的! 我有以下选项来初始化一个对象: Object* o = new Object(arg); 这会将对象放入堆中并返回指向它的指针。我不喜欢在嵌入式软件中使用动态分配。 Ob
我自己搜索过,没能成功的正则表达式。 我有一个 html 文件,其中包含 [] 之间的变量我想把每一个字都写进去。 [client_name][client_company] [cl
我是 Python 新手。我不明白为什么这段代码不起作用: reOptions = re.search( "[\s+@twitter\s+(?P\w+):(?P.*?)\s+]", d
在过去 7 个月左右的时间里,我几乎一直在使用 .NET C# 进行编程。在那之前,我的大部分编程都是用 C++(从学校里学的)。在工作中,我可能需要在接下来的几个月里做一大堆 C 语言。我对 C 的
我是 RE 的新手,我正在尝试获取歌词并分离出歌词标题、和声和主唱: 下面是一些歌词的例子: [Intro] D.A. got that dope! [Chorus: Travis Scott] Ic
这可能是不可能的,但我想检查是否可以用一种简单的方式表达这样的事情: // obviously doesn't work class Foo : IFoo where T: Bar {
我们的应用程序中有“user”和“study”实体,存储在它们各自的表中。一项研究代表一种研究和已收集的数据。它们是多对多的关系,所以我们需要一个链接表:studies_users。 我们为用户分配角
将测试条件添加到 Visual Studio 2010 数据库单元测试(对于 SQL Server 2008)时,这些条件称为例如rowCountCondition1、rowCountConditio
在模拟器上,我可以从设置中卸载 SD 卡。 然后我可以将它安装到我的操作系统上,然后正常卸载它。 我一直无法弄清楚如何在模拟器上重新安装它(无需重新启动)。 提示: adb 命令 remount 是无
假设在一个分支上执行了一系列提交,但该分支尚未与主干重新同步。是否可以从提交中生成全局补丁?是否可以从一系列提交中生成“分组”补丁?如果是,如何? 最佳答案 svn diff -rXXX:YYY UR
在某些情况下,我想在我的应用程序中锁定调整大小功能,为此我尝试对属性进行数据绑定(bind),并且不允许在某些情况下更改它,但没有成功。 有没有办法这样做? 这是我不成功的尝试: XAML: Vie
当我的计算机连接多个显示器时,我可以检测它们,并根据从获取的值设置位置来向它们绘制图形 get(0, 'MonitorPositions') 但是,当我在 MATLAB 运行时断开监视器时,此属性不会
我们有一个grails应用程序,该应用程序在grails数据库中存储了各种域对象。该应用程序连接到第二个数据库,运行一些原始sql,并在表中显示结果。它基本上是一个报告服务器。 我们通过在DataSo
无法比较来自不同容器的迭代器(参见这里的示例: https://stackoverflow.com/a/4664519/225186 )(或者从技术上讲,它不需要有意义。) 这就提出了另一个问题,来自
我有以下情况: 家长 Activity : ParentActivityClass { private Intent intent; @Override public void onCreate(Bu
我经常将元素与附加功能 Hook ,例如: $('.myfav').autocomplete(); $('.myfav').datepicker(); $('.myfav').click(somefu
因此,我将 tooltipster.js 库用于工具提示,并尝试更改工具提示在不同屏幕尺寸上的默认距离。 所以这是默认的 init 的样子: $(inputTooltipTrigger).tool
我在 ARM7 嵌入式环境中工作。我使用的编译器不支持完整的 C++ 功能。它不支持的一项功能是动态类型转换。 有没有办法实现dynamic_cast<>() ? 我使用 Google 寻找代码,但到
我是一名优秀的程序员,十分优秀!