Breeze 使用backingstore模型库和显式密钥属性时出错

Breeze 使用backingstore模型库和显式密钥属性时出错,breeze,Breeze,我们目前正在努力让breeze和typescript一起工作。。。我们正在使用angular,因此计划使用breeze的“backingStore”模型库。。。我们不打算使用ko或主干 // configure to use the model library for Angular breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true); 我们在设计时定义所有typescrip

我们目前正在努力让breeze和typescript一起工作。。。我们正在使用angular,因此计划使用breeze的“backingStore”模型库。。。我们不打算使用ko或主干

    // configure to use the model library for Angular
    breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);
我们在设计时定义所有typescript实体属性,包括关键属性。。。当实体具有设计时键属性和导航数组属性时,“backingStore”实现似乎失败。特别是breeze.debug.js的第4470行出现了问题:

     npValue.forEach(function(iv) {
     iv.setProperty(fkName, newValue);
如果我理解正确,“npValue”应该是一个包含子实体的数组。。。如果此值为空,则上述代码失败。。。当breeze由于调用服务器而在客户端加载实体时,此代码似乎正在运行。。。只有在父对象的“key”属性在实体的构造函数中的代码中明确定义时,才会发生这种情况。对“movePropsToBackingStore”的调用似乎是删除属性,然后将它们添加回。。。当对key属性执行此操作时,会出现此问题

无论如何,这是一个bug还是breeze不支持键属性的显式定义?还是别的什么问题?要重现此问题,您只需按如下方式调整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
    };

谢谢

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

长话短说 我听从了你的建议,犯了一个你说我会犯的错误。Breeze抱怨说,在保存
TodoList
后,它不知道如何修复主键

这完全是意料之中的。。。因为您在构造函数中将
TodoList
主键设置为
null
null
永远不是有效的主键值

现在,由于密钥是存储生成的,所以服务器确实保存了一个新的
TodoList
,并返回了数据库分配的主键值。Breeze发现该键已更改,并希望修复对该
TodoList
的其他潜在实体引用。它将查找具有预保存值的实体。但它不准备搜索
null

这里有一只微风虫。我们不应该让您将
null
指定为主键。我会把那个bug归档,我们很快就会修复它

同时,您可以使用值
0
而不是
null

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

但如果将其设置为
null
或任何非零整数(例如
1
),Breeze会假定您希望将密钥初始化为该特定值。因此,您创建的每个
TodoList
实体都将具有
id=1
。这可能是第一次创造工作;它不会与第二个相同,因为会发生id冲突(同一管理器中相同类型的两个实体不能具有相同的键)

所以使用
0
。希望这是清楚的

顺便说一句,“NoDb”示例使用Knockout。我知道你用的是角度。我认为这种差异无关紧要。问题的性质应该是相同的。我想你会告诉我这是否重要

您是否在客户端上定义元数据? 我之所以这样问是因为“NoDb”示例确实如此,而且它在定义主键列方面非常精确:

function addTodoListType(store) { store.addEntityType({ shortName: "TodoList", namespace: "NoDb.Models", autoGeneratedKeyType: AutoGeneratedKeyType.Identity, dataProperties: { todoListId: { dataType: DataType.Int32, isNullable: false, isPartOfKey: true }, title: { dataType: DataType.String, maxLength: 30, isNullable: false } }, navigationProperties: { // returns a collection of TodoItems -- associates with TodoItem.TodoList todos: { entityTypeName: "TodoItem", isScalar: false, associationName: "TodoList_Items" } } }); 函数addTodoListType(存储){ store.addEntityType({ 短名:“托多利斯特”, 命名空间:“NoDb.Models”, autoGeneratedKeyType:autoGeneratedKeyType.Identity, 数据属性:{ todoListId:{dataType:dataType.Int32,isNullable:false,isPartOfKey:true}, 标题:{dataType:dataType.String,maxLength:30,isNullable:false} }, 导航属性:{ //返回TodoItems的集合--与TodoItem.TodoList关联 todos:{entityTypeName:“TodoItem”,isScalar:false,associationName:“TodoList_Items”} } }); 注意

  • 通过说
    isPartOfKey:true

  • 告诉Breeze此类型的密钥是存储生成的:
    autoGeneratedKeyType:autoGeneratedKeyType.Identity


我以上的评论假设你的申请像“NoDb”在这些方面,即使它的模型库使用Angular而不是Knockout。

非常感谢您的回答……现在我使用0而不是null,情况似乎正常了……当您谈到如何在保存todolist时看到这个问题时,您有点让我不知所措……但看看我最初的问题,我可以看出我并不清楚当我看到这个问题的时候…我在初始加载实体时立即得到了错误…我没有尝试保存…但在任何情况下,您描述的解决方案都有效…谢谢…关于敲除与角度,如果我使用null而不是0,并使用ko,初始加载时的错误不会发生…谢谢,哦,我忘记了ion,是的,我们正在客户端生成元数据…谢谢