0

我们目前正在尝试让微风和打字稿一起工作......我们正在使用角度,因此计划使用微风的“backingStore”模型库......我们不打算使用ko或骨干......

    // configure to use the model library for Angular
    breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);

我们在设计时定义所有打字稿实体属性,包括关键属性......当实体具有设计时关键属性和导航数组属性时,“backingStore”实现似乎失败。具体来说,微风.debug.js 的第 4470 行出现了问题:

     npValue.forEach(function(iv) {
     iv.setProperty(fkName, newValue);

如果我理解正确,“npValue”应该是一个包含子实体的数组......如果这个值为空,上面的代码失败......这个代码似乎在微风加载实体客户端时运行,因为调用服务器......只有在实体构造函数内的代码中明确定义父级的“键”属性时才会发生这种情况。对“movePropsToBackingStore”的调用似乎是删除属性,然后将它们添加回来......当对关键属性完成此操作时,就会出现这个问题......

无论如何,这是一个错误还是微风不支持关键属性的显式定义?还是有其他问题?要重现此问题,您只需调整 NoDb 示例,如下所示:

    // configure to use the model library for Angular
    breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);

    var TodoList = function () {
        this.title = "My todos";            
        this.todoListId = null; //explicitly define key prop
    };

谢谢你

4

1 回答 1

0

简短回答:将主键初始化为0,而不是 null。

长答案

我听从了你的建议,但正如你所说的那样,我遇到了一个错误。Breeze 抱怨它不知道如何在保存TodoList.

这完全是意料之中的......因为您在构造函数中设置了TodoList主键nullnull绝不是有效的主键值

现在,碰巧的是,因为键是存储生成的,所以服务器确实保存了一个新的TodoList并使用 db 分配的主键值返回它。Breeze 看到 key 发生了变化,并希望修复其他潜在的实体引用 this TodoList。它将查找具有预保存值的实体。但它不准备搜索该null值。

这里有一个微风错误。我们不应该让您指定null为主键。我会提交这个错误,我们会尽快修复它。

同时,您应该可以使用 value0而不是null.

重要提示:您必须使用 value 0。没有其他整数会做!存储生成密钥时,类型默认值(0是整数类型默认值)对 Breeze 具有特殊意义。它告诉 Breeze “对于每次创建,用一个新的临时键值替换这个键,一个占位符,直到我保存这个实体。”

但是,如果您将其设置为null或任何非零整数(例如1),Breeze 会假定您要将键初始化为该特定值。因此,TodoList您创建的每个实体都将具有id=1. 这可能适用于第一次创建;第二个不会,因为你会有一个 id 冲突(同一个管理器中没有两个相同类型的实体可以有相同的键)。

所以使用0. 希望这很清楚。

顺便说一句,“NoDb”示例使用 Knockout。我意识到你正在使用 Angular。我认为差异并不重要。问题的性质应该是一样的。我想你会告诉我这是否重要。

您是否在客户端上定义元数据?

我问是因为“NoDb”示例确实如此,并且它在如何定义主键列方面非常精确:

函数 addTodoListType(store) {
    store.addEntityType({
        shortName: "待办事项列表",
        命名空间:“NoDb.Models”,
        autoGeneratedKeyType:AutoGeneratedKeyType.Identity,
        数据属性:{
            todoListId: { dataType: DataType.Int32, isNullable: false, isPartOfKey: true },
            标题:{ dataType:DataType.String,maxLength:30,isNullable:false }
        },
        导航属性:{
            // 返回一个 TodoItems 的集合——与 TodoItem.TodoList 关联
            待办事项:{ entityTypeName:“TodoItem”,isScalar:false,associationName:“TodoList_Items”}
        }
    });

请注意,它

  • 通过说识别todoListId为关键isPartOfKey: true

  • 告诉 Breeze 这种类型的密钥是商店生成的:autoGeneratedKeyType: AutoGeneratedKeyType.Identity

我上面的评论假设你的应用程序在这些方面就像“NoDb”,即使它使用 Angular 而不是 Knockout 作为其模型库。

于 2013-06-05T02:24:00.250 回答