具有多部分键的实体的自动生成的键

时间:2012-12-10 07:45:58

标签: breeze

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

对于具有多部分键的实体,无法自动生成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是一个自生成字段。

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

问候语。

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,但我已经成功解决了这个问题而没有更改主键(PK)

我的PK有2列

  

ProductId(身份)
  TenantId(多租户申请)

所以第一个问题是当新项目添加到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);

第二个问题是Breeze无法使用ProductId中的实际值更新EntityFramework,因为它通过 PK 获取实体,并且返回的值只有{ {1}}。所以你需要覆盖函数:

ProductId

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

答案 1 :(得分:0)

此功能目前不在路线图上,但我想更好地了解您的用例。正如您所知,Breeze支持自动生成的密钥,而Breeze支持多部分密钥,但您在哪些情况下同时使用这两个密钥才能发挥作用?

谢谢!

答案 2 :(得分:0)

实际上,自动生成密钥的部分的多部分密钥实际上很常见。这通常发生在旧数据库中,其中主键由外键属性和“自动生成”序列号属性组成。通常,此自动生成的密钥本身不是全局唯一的,而是仅与外键属性一起使用。可以考虑使用“OrderId,SequenceNumber”外键的orderDetail。

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

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

这有意义吗?