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