2

例如我们有一个表:

  • ParentID(主键)
  • 父类型

...并且根据 ParentType 有一些其他详细信息表,例如ParentType1Detail

  • ParentID(主键)
  • 更多特定于类型 1 父级的字段

ParentParentType1Detail都具有相同的 ParentID 主键,形成 1 到 (0..1) 的关系。

现在考虑 Breeze 中的一种情况,我们在缓存中有一个现有的ParentParentType1Detail。用户将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);
            }
        });
    }
}
4

1 回答 1

1

抱歉花了这么长时间才看这个。我喜欢你的修复建议。我将尝试将其合并到 Breeze 的下一个版本中,并在它进入时发回此处。感谢您的贡献:)

于 2013-04-17T19:49:09.377 回答