例如我们有一个父表:
- ParentID(主键)
- 父类型
...并且根据 ParentType 有一些其他详细信息表,例如ParentType1Detail:
- ParentID(主键)
- 更多特定于类型 1 父级的字段
Parent和ParentType1Detail都具有相同的 ParentID 主键,形成 1 到 (0..1) 的关系。
现在考虑 Breeze 中的一种情况,我们在缓存中有一个现有的Parent和ParentType1Detail。用户将Parent更改为“Type2”,因此我们要删除ParentType1Detail记录。当我们调用 parentType1Detail.entityAspect.setDeleted() 时,Breeze 似乎也返回并将Parent实体上的 ParentID 属性清零,从而杀死了父母的主键!
这对于一个正常的关系是有意义的,在这种关系中,Parent有 ChildID 属性,详细信息表是键控的,但如果加入属性也是父级主键的一部分,则该属性不起作用。
如果不清楚或已经讨论过,我深表歉意,但我很感激有关如何处理上述问题的任何建议(无需过多地重构数据库)。或者也许 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);
}
});
}
}