0

我遇到了问题,我扩展实体以公开 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();
4

2 回答 2

1

如果实体的类型的元数据指定支持此功能,则实体只会获得自己的自动生成密钥。IE

if (myEntityType.autoGeneratedKeyType === AutoGeneratedKeyType.Identity)

此设置意味着实体的键属性由服务器自动生成,通常用于数据库上的“身份”列。

或者

if (myEntityType.autoGeneratedKeyType === AutoGeneratedKeyType.KeyGenerated)

此设置意味着您有一个可以为您生成密钥的服务器端 KeyGenerator。

但是,默认情况下, myEntityType.autoGeneratedKeyType 将等于AutoGeneratedKeyType.None

在其他两种情况下,微风将在客户端生成一个临时密钥,然后在保存完成后使用服务器上生成的“真实”密钥修复它。

如果您不需要此功能,则只需为您的类型创建自己的 ctor,生成唯一键并将其设置在那里。有关如何注册 ctor 的更多详细信息,请参阅MetadataStore.registerEntityTypeCtor 。

我们正计划改进我们在这方面的文档,但还没有做到。我希望这有帮助。

于 2013-01-03T21:43:45.957 回答
0

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

您收到的验证错误是什么?它与 Country_ID 有关吗?也许您对 Country_ID 有一个验证约束(例如,最小值)?

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

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

EntityManager的默认validationOptions设置是为了在实体附加(或添加)到管理器时验证实体。您可以更改该行为以满足您的需要。

新员工在创建时处于无效状态;它缺少必需的名字和姓氏值(测试显示这些错误)。因此,在将新员工添加到经理之后, hasValidationErrorsobservable 就变成了,并且observable 会发出一个 Knockout UI 会听到的更改通知;这些测试显示了这两点。truehasValidationErrors

于 2013-01-04T21:52:51.947 回答