1

我们仍在使用 Northwind 数据库测试 Breeze,我们遇到了一个奇怪的行为。

首先,我几乎可以确定这不是错误,不可能,它是如此基本的操作。

我们有一个产品实体,我们将其 SupplierID 设置为 null(外键可以为 null),如下所示,

product.SupplierID(null)

在这微风之后做这些,

  1. 将产品的 SupplierID 值设置为 null
  2. 将产品的供应商设置为空
  3. 将产品的 SupplierID 设置为 0

这会导致外键异常。

可能这是一个简单的问题,我们必须错过一些东西,我的一位同事从今天早上开始就试图解决这个问题,但没有运气。

他发现在此分配之后轻风调用了两次(一次用于供应商 ID,另一次用于供应商)并将它们分配为空值。

result = ko.computed({
                read: target,  //always return the original observables value
                write: function(newValue) {
                    instance._$interceptor(property, newValue, target);
                    return instance;
                }
            });

在这微风检查外键并执行这一行之后,

if (property.relatedDataProperties) {
if (!entityAspect.entityState.isDeleted()) {
    var inverseKeyProps = property.entityType.keyProperties;
    inverseKeyProps.forEach(function(keyProp, i ) {
        var relatedValue = newValue ? newValue.getProperty(keyProp.name) : keyProp.defaultValue;
        that.setProperty(property.relatedDataProperties[i].name, relatedValue);
    });
}

有趣的是,这一行检查 value 是否为 null(对于 product.SupplierID),如果为 null,则设置为 Supplier 表的 key 属性的默认值,并且为 0(它不能为 null,因为它是主键)。

我们刚刚更新到 0.80.2 版本,但行为仍然相同。

提前致谢。

[更新]

这是我们的测试,

test("set foreign key property to null", 3, function () {
    var productQuery = new EntityQuery("Products").take(1)
        .expand("Supplier");

    stop();
    queryForOne(newEm, productQuery, "First Product")
        .then(assertProductSetSupplierIDToNull)
        .fail(handleFail)
        .fin(start);
});

function assertProductSetSupplierIDToNull(data) {
    var products = data.results;
    var firstProduct = products[0];

    ok(firstProduct.SupplierID(), "SupplierID is "+firstProduct.SupplierID());

    firstProduct.SupplierID(null);

    equal(firstProduct.SupplierID(), null, "is SupplierID null?");
}

结果是,

另一个有趣的事情是,如果我们像这样设置这个值两次,

    firstProduct.SupplierID(null);
    firstProduct.SupplierID(null);

测试通过,

在此处输入图像描述

我希望这个样本足以重现这种行为。

提前致谢。

4

1 回答 1

1

这是一个错误,已在 v 0.80.3 中修复,可在微风网站上找到。...感谢单元测试;它真的有帮助。

于 2012-12-25T17:25:41.057 回答