添加新实体时,不会生成标识值

时间:2013-01-03 19:36:21

标签: breeze

我遇到了问题,我扩展了Entity以暴露hasValidationError。没有它,它工作正常。另外我发现如果我在添加实体之前提供ID,它也可以正常工作。为什么在客户端上扩展实体后,ID字段不会自动生成。

我现在使用的是不同版本的代码(我发现以这种方式扩展实体更直观),但它仍然以同样的方式出错。

       var Country = function () {
                           console.log("Country initialized");
                           var self = this;
                           self.Country_ID = ko.observable(""); 
                           self.Country_Code = ko.observable("");  
                           self.Country_Name = ko.observable().extend({
                               validation: {
                                   validator: function (val, someOtherVal) {

                                       return false;//val === someOtherVal;
                                   },
                                   message: 'Invalid Value!',
                                   params: 5
                               }
                           });

                           var prop = ko.observable(false);

                           var onChange = function () {
                               var hasError = self.entityAspect.getValidationErrors().length > 0;

                               if (prop() === hasError) {
                                   // collection changed even though entity net error state is unchanged
                                   prop.valueHasMutated(); // force notification
                               } else {
                                   prop(hasError); // change the value and notify
                               }
                           };

                           // observable property is wired up; now add it to the entity
                           self.hasValidationErrors = prop;

                           //dummy property to wireup event
                           //should not be used for any other purpose
                           self.hasError =  ko.computed(
                                                {
                                                    read: function () {
                                                        self.entityAspect // ... and when errors collection changes
                                                                .validationErrorsChanged.subscribe(onChange);
                                                    },

                                                    // required because entityAspect property will not be available till Query
                                                    // return some data
                                                    deferEvaluation: true

                                                });


                           self.fullName = ko.computed(
                                            function () {
                                                return self.Country_Code() + " --- " + self.Country_Name();
                                            });
                       };


                       store.registerEntityTypeCtor("Country", Country);

然后在按钮单击中我使用以下代码创建新实体。

          var countryType = manager.metadataStore.getEntityType("Country"); 
                           var newCountry = countryType.createEntity(); 
                           //newCountry.Country_ID(200); //if i add this line no errors occurs
                           newCountry.Country_Code("India");

                           self.list.push(newCountry);

                           manager.addEntity(newCountry); // validation error occurs right after this line

                           self.selectedItem(newCountry);
                           self.list.valueHasMutated();

1 个答案:

答案 0 :(得分:0)

也许没有任何错误。你怎么知道id生成失败了?将newCountry添加到管理器后是否为负数?应该是。

您获得的验证错误是什么?它与Country_ID有关吗?也许您在Country_ID上有验证约束(例如,最小值)

addhasValidationErrorsProperty实体初始值设定项按预期工作。我刚刚在DocCode示例中添加了一个教学测试(参见“在entityExtensionTests.js中注册addhasValidationErrorsProperty初始化程序后可以创建员工”)。我写这篇文章时没有部署它,但你可以从GitHub获得它。

我尽可能地使用具有身份标识(Employee_ID)的Northwind Employee实体。测试显示添加了我在上一篇文章中写的初始化程序(而不是你可能已经重写过它)。它表示在添加到管理器之前新的Employee的id为零,并且在添加到管理器后变为-1。 -1是新员工的临时ID;保存后它会收到一个永久值。

设置EntityManager的默认validationOptions,以便在将实体附加(或添加)到管理器时对其进行验证。您可以根据自己的需要更改该行为。

新员工在创建时处于无效状态;它缺少必需的First和Last名称值(测试显示这些错误)。因此,在将新员工添加到经理后,hasValidationErrors observable变为truehasValidationErrors observable会发出Knockout UI会听到的更改通知;这些测试显示了这两点。