例如,我们有一个 Parent 表:
...并且根据ParentType还有一些其他详细信息表,例如 ParentType1Detail :
Parent 和 ParentType1Detail 都具有相同的ParentID主键,形成1到(0..1)的关系。
现在考虑一下Breeze中的情况,我们在缓存中有一个现有的 Parent 和 ParentType1Detail 。用户将 Parent 更改为“Type2”,因此我们要删除 ParentType1Detail 记录。当我们调用parentType1Detail.entityAspect.setDeleted()时,Breeze似乎也会返回并将 Parent 实体上的ParentID属性清零,从而终止父父主键!
这对于正常关系是有意义的,其中 Parent 具有详细信息表被键入的ChildID属性,但是如果加入属性也是父主键的一部分则不起作用。< / p>
如果不清楚或已经讨论过,我很抱歉,但我很感激有关如何处理上述问题的任何建议(没有过多地重构数据库)。或者也许Breeze可以处理这种情况,我们的EF配置在某种程度上是错误的?
更新:黑客解决问题(希望如此)
埋藏在 defaultPropertyInterceptor 中,有以下代码:
// update fk data property
if (property.relatedDataProperties) {
if (!entityAspect.entityState.isDeleted()) {
var inverseKeyProps = property.entityType.keyProperties;
inverseKeyProps.forEach(function(keyProp, i ) {
var relatedDataProp = property.relatedDataProperties[i];
var relatedValue = newValue ? newValue.getProperty(keyProp.name) : relatedDataProp.defaultValue;
that.setProperty(relatedDataProp.name, relatedValue);
});
}
}
如果相关属性是实体键的一部分,我们已插入测试来抑制更改:
// update fk data property
if (property.relatedDataProperties) {
if (!entityAspect.entityState.isDeleted()) {
var inverseKeyProps = property.entityType.keyProperties;
inverseKeyProps.forEach(function(keyProp, i ) {
var relatedDataProp = property.relatedDataProperties[i];
// Do not trash related property if it is part of that entity's key
if (newValue || !relatedDataProp.isPartOfKey) {
var relatedValue = newValue ? newValue.getProperty(keyProp.name) : relatedDataProp.defaultValue;
that.setProperty(relatedDataProp.name, relatedValue);
}
});
}
}
答案 0 :(得分:1)
很抱歉花了这么长时间才看到这个。我喜欢你的解决方案。我会尝试将它合并到下一个版本的Breeze中,并在它进入时将在此发回。并且thx为贡献:)