问题是使用相同的主键删除1到(0..1)“子”记录?

时间:2013-04-17 00:28:04

标签: breeze

例如,我们有一个 Parent 表:

  • ParentID(主键)
  • ParentType的

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

  • ParentID(主键)
  • 特定于类型1父级的一些其他字段

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);
            }
        });
    }
}

1 个答案:

答案 0 :(得分:1)

很抱歉花了这么长时间才看到这个。我喜欢你的解决方案。我会尝试将它合并到下一个版本的Breeze中,并在它进入时将在此发回。并且thx为贡献:)