Мы все еще тестируем Breeze с базой данных Northwind и столкнулись со странным поведением.
Во-первых, я почти уверен, что это не ошибка, этого не может быть, это настолько базовая операция.
У нас есть объект продукта, и мы устанавливаем его SupplierID равным нулю (внешний ключ может принимать значение null) следующим образом:
product.SupplierID(null)
после этого ветерка сделай это,
- Установить значение SupplierID продукта равным нулю
- Установить поставщика продукта на ноль
- Установите для продукта 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);
испытание пройдено,
Я надеюсь, что этого примера будет достаточно, чтобы воспроизвести это поведение.
Заранее спасибо.