Breeze 具有多部分关键点的实体的自动生成关键点
我试图创建一个新对象,该对象具有由外键和自行生成的字段组成的多列主键,我发现以下错误: 无法为具有多部分密钥的实体自动生成ID 现在,虽然不是最合适的,但我将更改关键点,但问题是: 您是否计划支持多列主键很快自动生成 我也会将请求添加到uservoice 问候语 编辑以解释用例: 你好, 诚然,将主键由外键和自行生成的字段组成可能没有意义 我的想法是建立一个这样的表格:Breeze 具有多部分关键点的实体的自动生成关键点,breeze,Breeze,我试图创建一个新对象,该对象具有由外键和自行生成的字段组成的多列主键,我发现以下错误: 无法为具有多部分密钥的实体自动生成ID 现在,虽然不是最合适的,但我将更改关键点,但问题是: 您是否计划支持多列主键很快自动生成 我也会将请求添加到uservoice 问候语 编辑以解释用例: 你好, 诚然,将主键由外键和自行生成的字段组成可能没有意义 我的想法是建立一个这样的表格: ParentID ChildID Data 1 1
ParentID ChildID Data
1 1 Some Data...
1 2 Some Data...
2 1 Some Data...
2 2 Some Data...
ParentID ChildID Data
1 1 Some Data...
1 2 Some Data...
2 3 Some Data...
2 4 Some Data...
第一步,我做了一张这样的桌子:
ParentID ChildID Data
1 1 Some Data...
1 2 Some Data...
2 1 Some Data...
2 2 Some Data...
ParentID ChildID Data
1 1 Some Data...
1 2 Some Data...
2 3 Some Data...
2 4 Some Data...
其中ChildID是一个自行生成的字段
所以你可以忽略我的问题
问候语。此功能目前不在路线图上,但我想更好地了解您的使用案例。正如您已经知道的,Breeze支持自动生成的关键点,并且Breeze支持多部分关键点,但是您发现同时使用这两种关键点会有什么帮助呢
谢谢 实际上有一个多部分键,其中键的部分是自动生成的,这是非常常见的。这通常发生在旧式数据库中,其中主键由外键属性和“自动生成”序列号属性组成。通常,此自动生成的密钥本身不是全局唯一的,但仅与外键属性结合使用。设想一个外键为“OrderId,SequenceNumber”的orderDetail 当主键由多个自动生成的属性组成时,似乎没有多大意义 在Breeze中,自动生成的关键点旨在全局唯一。然而,在上面提到的多部分密钥中,SequenceNumber不是全局唯一的(如果是,为什么不让它自己成为主键)
这有意义吗?我也遇到过同样的问题,但我在不更改主键(PK)的情况下成功地解决了它 我的PK有2列 ProductId(标识)
租户(多租户申请) 因此,第一个问题是,当新项目添加到
EntityManager
时,Breeze无法生成新的PK。我已经定义了自定义实体初始化函数:
var manager = new breeze.EntityManager(breezeServiceUrl);
var store = manager.metadataStore;
function itemInitializer(item) {
if (item.ProductId() == 0) {
item.ProductId(/*Some counter value*/);
}
if (item.TenantId() == 0) {
item.TenantId(TenantId);
}
if (item.isBeingEdited === undefined) {
item.isBeingEdited = ko.observable(false);
}
};
store.registerEntityTypeCtor("ProductItem", function() {/*Leave empty to use default constructor*/}, itemInitializer);
var entityType = store.getEntityType("ProductItem");
var entityGroup = manager.findEntityGroup(entityType);
entityGroup._fixupKey = function (tempValue, realValue) {
var ix = this._indexMap[tempValue + ":::" + TenantId]; //Changed line
if (ix === undefined) {
throw new Error("Internal Error in key fixup - unable to locate entity");
}
var entity = this._entities[ix];
var keyPropName = entity.entityType.keyProperties[0].name;
entity.setProperty(keyPropName, realValue);
delete entity.entityAspect.hasTempKey;
delete this._indexMap[tempValue];
this._indexMap[realValue] = ix;
};
第二个问题是Breeze无法使用EntityFramework
中的实际值更新ProductId
,因为它通过PK获取实体,返回的值只有ProductId
。因此,您需要重写该函数:
var manager = new breeze.EntityManager(breezeServiceUrl);
var store = manager.metadataStore;
function itemInitializer(item) {
if (item.ProductId() == 0) {
item.ProductId(/*Some counter value*/);
}
if (item.TenantId() == 0) {
item.TenantId(TenantId);
}
if (item.isBeingEdited === undefined) {
item.isBeingEdited = ko.observable(false);
}
};
store.registerEntityTypeCtor("ProductItem", function() {/*Leave empty to use default constructor*/}, itemInitializer);
var entityType = store.getEntityType("ProductItem");
var entityGroup = manager.findEntityGroup(entityType);
entityGroup._fixupKey = function (tempValue, realValue) {
var ix = this._indexMap[tempValue + ":::" + TenantId]; //Changed line
if (ix === undefined) {
throw new Error("Internal Error in key fixup - unable to locate entity");
}
var entity = this._entities[ix];
var keyPropName = entity.entityType.keyProperties[0].name;
entity.setProperty(keyPropName, realValue);
delete entity.entityAspect.hasTempKey;
delete this._indexMap[tempValue];
this._indexMap[realValue] = ix;
};
如果您对多部分密钥有任何其他问题,可以在中阅读。您对orderDetail的描述就是我要做的。在完成之前,我只将密钥更改为一个自动生成的属性。此问题是否仅适用于标识类型或所有db生成的值?我想知道设置为[DatabaseGenerated(DatabaseGeneratedOption.None)]是否可以修复。。