Breeze присваивает значение по умолчанию свойству внешнего ключа после установки для него значения null

Мы все еще тестируем Breeze с базой данных Northwind и столкнулись со странным поведением.

Во-первых, я почти уверен, что это не ошибка, этого не может быть, это настолько базовая операция.

У нас есть объект продукта, и мы устанавливаем его SupplierID равным нулю (внешний ключ может принимать значение null) следующим образом:

product.SupplierID(null)

после этого ветерка сделай это,

  1. Установить значение SupplierID продукта равным нулю
  2. Установить поставщика продукта на ноль
  3. Установите для продукта SupplierID значение 0

и это вызывает исключение внешнего ключа.

Вероятно, это простая проблема, мы должны что-то упустить, один из моих коллег пытается решить ее с утра, но безуспешно.

Он обнаруживает, что после этого присваивания ветерок вызывает это дважды (один для SupplierID и другой для Supplier) и присваивает им нули.

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

интересно, эта строка проверяет, является ли значение нулевым (для product.SupplierID), и если оно равно нулю, оно устанавливает значение по умолчанию для свойства ключа таблицы Supplier, и оно равно 0 (оно не может быть нулевым, потому что это первичный ключ).

Мы только что обновились до версии 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);

испытание пройдено,

введите здесь описание изображения

Я надеюсь, что этого примера будет достаточно, чтобы воспроизвести это поведение.

Заранее спасибо.


person Umut Ozel    schedule 25.12.2012    source источник


Ответы (1)


Это была ошибка, она исправлена ​​в версии 0.80.3 и доступна на веб-сайте breeze. ... и спасибо за модульный тест; это действительно помогло.

person Jay Traband    schedule 25.12.2012
comment
Умут, пожалуйста, дайте нам знать, если это решит вашу проблему. - person Jay Traband; 27.12.2012
comment
Джей работает отлично, большое спасибо. Также хочу еще раз поблагодарить вас за такой замечательный инструмент :) - person Umut Ozel; 28.12.2012