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

Breeze 具有多部分关键点的实体的自动生成关键点,breeze,Breeze,我试图创建一个新对象,该对象具有由外键和自行生成的字段组成的多列主键,我发现以下错误: 无法为具有多部分密钥的实体自动生成ID 现在,虽然不是最合适的,但我将更改关键点,但问题是: 您是否计划支持多列主键很快自动生成 我也会将请求添加到uservoice 问候语 编辑以解释用例: 你好, 诚然,将主键由外键和自行生成的字段组成可能没有意义 我的想法是建立一个这样的表格: ParentID ChildID Data 1 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...
第一步,我做了一张这样的桌子:

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)]是否可以修复。。