1

我试图用由外键和自生成字段形成的多列主键创建一个新对象,我发现了这个错误:

无法为具有多部分键的实体自动生成 ID。

现在,虽然不是最合适的,但我会更改密钥,但问题是:

您是否计划很快支持自动生成的多列主键?

我也会将请求添加到 uservoice。

问候。

编辑以解释用例:

你好,

诚然,由外键和自生成字段组成的主键可能没有意义。

我的想法是建立一个这样的表:

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 是一个自行生成的字段。

所以你可以忽略我的问题。

问候。

4

3 回答 3

2

我遇到了同样的问题,但我在不更改Primary Key (PK)的情况下成功解决了它。

我的 PK 有 2 列

ProductId(身份)
TenantId(多租户应用程序)

所以第一个问题是当新项目添加到EntityManager. 我已经定义了自定义实体初始化函数:

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);

第二个问题是 Breeze 无法ProductId使用实际值更新 ,EntityFramework因为它通过PK获取实体并且返回的值只有ProductId. 所以你需要重写这个函数:

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;
};

如果您对多部分密钥有任何其他疑问,可以在博客中阅读。

于 2013-02-27T09:06:04.037 回答
0

此功能目前不在路线图上,但我想更好地了解您的用例。如您所知,Breeze 支持自动生成的密钥,而 Breeze 支持多部分密钥,但您发现同时使用这两种密钥的哪些场景会有所帮助?

谢谢!

于 2012-12-10T23:29:20.417 回答
0

实际上有一个多部分密钥,其中部分密钥是自动生成的,实际上很常见。这通常发生在主键由外键属性和“自动生成”序列号属性组成的遗留数据库中。通常这个自动生成的键本身不是全局唯一的,而只能与外键属性结合使用。考虑一个外键为“OrderId,SequenceNumber”的 orderDetail。

当主键包含多个自动生成的属性时,似乎没有多大意义。

在 Breeze 中,自动生成的密钥旨在全球唯一。然而,在上面提到的多部分键中,SequenceNumber 不会是全局唯一的(如果是,那么为什么不单独将其作为主键)。

这有意义吗?

于 2012-12-11T20:50:24.457 回答