我试图创建一个新对象,其中包含由外键和自生成字段组成的多列主键,我发现了这个错误:
对于具有多部分键的实体,无法自动生成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是一个自生成字段。
所以你可以忽略我的问题。
问候语。
答案 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不是全局唯一的(如果是那么为什么不将它本身作为主键)。
这有意义吗?