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

Breeze 添加新实体时,不会生成标识值,breeze,Breeze,我遇到了一个问题,我扩展了实体以公开hasValidationError。如果没有这一点,它可以正常工作。我还发现,如果在添加实体之前提供ID,它也可以正常工作。为什么在客户机上扩展实体后,ID字段不会自动生成 我现在使用的代码版本略有不同(我发现以这种方式扩展实体更直观),但它仍然以同样的方式出错 var Country = function () { console.log("Country initialized");

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

只有当实体类型的元数据指定支持自动生成密钥时,实体才会获得自己的自动生成密钥。i、 e

if (myEntityType.autoGeneratedKeyType === AutoGeneratedKeyType.Identity)
此设置意味着实体的键属性由服务器自动生成,通常用于数据库中的“标识”列

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


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

在另外两种情况中,breeze将在客户端生成一个临时密钥,然后在保存完成后在服务器上生成一个“真实”密钥来修复它

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


我们正在计划改进这一领域的文档,但尚未实现。我希望这能有所帮助。

也许根本没有什么问题。您如何知道id生成失败?将新国家/地区添加到经理后是否为负数?应该是

您得到的验证错误是什么?它与国家/地区ID有关吗?也许您对国家/地区ID有验证约束(例如,最小值)

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

它尽我所能地遵循您的示例,使用Northwind
Employee
实体,该实体具有一个标识id(Employee_id)。测试显示添加了我在上一篇文章中写的初始值设定项(而不是您可能重写的)。它显示新员工的id在添加到经理之前为零,在添加到经理之后变为-1。-1是新员工的临时id;保存后,它将收到一个永久值

EntityManager的默认
validationOptions
设置为在将实体附加(或添加)到管理器时对其进行验证。你可以改变这种行为来满足你的需要


新员工创建时处于无效状态;它缺少所需的名字和姓氏值(测试显示这些错误)。因此,在将新员工添加到经理后,
hasvalidateErrors
可观察到的将变为
true
,并且
hasvalidateErrors
可观察到的将发出一个更改通知,淘汰UI将听到该通知;这些测试显示了这两点。

请重新格式化您的问题。一团糟。我通过
store.registerEntityTypeCtor
识别出你问题中的代码。。。因为我在别处写的:)。除此之外,我很困惑,因为您创建了一个
新国家
,而不是一个新的
员工
。如果这真的是您的代码,那么您注册了一个与国家类型无关的
员工
ctor。是的,我使用的代码与您在回答我的另一个问题时提供的代码相同。我修改为使用我的实体。感谢您澄清了KeyGeneration的概念,但我的问题是,当我不使用函数AddHasValidationErrorProperty(实体)时,为什么它工作得很好?我不确定我是否理解您的意图。你能澄清一下吗?请澄清一下。正如我在对您的问题的评论中指出的,
addhasvalidateErrorsProperty
员工
类型的初始值设定项,对您的
国家
类型没有任何影响。请按照Jay的建议,向我们报告
countryType.autoGeneratedKeyType
的值。如果它是
None
,则需要在客户端上进行设置。如果您认为这是错误的,那么您应该在服务器模型上向我们显示您的Country.Country\u ID的定义。myEntityType.autoGeneratedKeyType=“Identity”。服务器端类类似于这个公共类Country{[Key]public int Country\u ID{get;set;}[Required]公共字符串Country\u Code{get;set;}公共字符串Country\u Name{get;set;}Ok。。。如果
countryType.autoGeneratedKeyType===autoGeneratedKeyType.Identity
。。。这意味着客户机应该在客户机上为您维护临时密钥,在保存时用永久密钥替换它们。这意味着
newCountry.Country\u ID()
在添加到manager之前为0,在添加到manager之后为负整数。您是否已将
addhasvalidateErrorProperty
注册为
Country
初始值设定项并不重要。我将亲自测试这个断言。
if (myEntityType.autoGeneratedKeyType === AutoGeneratedKeyType.KeyGenerated)