Breeze.js:在没有反向rel的情况下向导航属性集合添加元素会引发异常[无法获取属性'name'的值]

时间:2013-04-09 18:22:49

标签: breeze

我的EDM中有两个实体,ApplicationAddress非常类似于以下内容:

class Application
{
    ICollection<Address> Addresses { get; set; }
}

class Address { }

在客户端上,我创建了每个实例,并尝试将address实例添加到Application.addresses集合中:

var address = addressType.createEntity(...);
var application = applicationType.createEntity(...);

application.addresses.push(address);

不幸的是,我得到一个运行时异常,说:“Unable to get value of the property 'name': object is null or undefined”。

我将异常追溯回checkForDups(v1.2.8)中的breeze.debug.js@9393-9404函数:

function checkForDups(relationArray, adds) {
    // don't allow dups in this array. - also prevents recursion 
    var inverseProp = relationArray.navigationProperty.inverse;
    var goodAdds = adds.filter(function(a) {
        if (relationArray._addsInProcess.indexOf(a) >= 0) {
            return false;
        }
        var inverseValue = a.getProperty(inverseProp.name);
        return inverseValue != relationArray.parentEntity;
    });
    return goodAdds;
}

碰巧,我的实体处于一对多的单向关系中(没有反向导航属性);因此,运行时relationArray.navigationProperty.inverse的结果为undefined,因此尝试访问name属性时出错。

添加简单的检查可以解决问题,并允许添加到集合中:

if (!inverseProp) {
    return true;
}

所有这一切之后,问题是:这是一个错误还是只是Breeze不支持一对多的单向?

1 个答案:

答案 0 :(得分:2)

编辑截至v Breeze 1.3.5,现已上市(2013年6月4日),此问题已修复。


编辑:好的,这是一个错误,但我无法获得当前版本的修复程序。我将尝试在以下版本中获取它。

你建议的修复,这是个好主意,实际上只是隐藏了这个问题。

真正的问题是,对于我们在1&n; n方向(即不在n-> 1方向上)具有单向导航的情况,微风没有足够的元数据。因此,导航集合中的重复实体检查将不起作用,并且也会丢失子项与父项的自动连接。

在我们获得修复之前最简单的解决方法是简单地使其成为双向导航。请注意,在另一个方向上的单向导航工作正常。


这可能是一个错误

我们在OrderDetails和Products之间的单向导航的DocCode示例项目中有一个示例。但在这种情况下,我们允许从OrderDetail导航 - &gt;产品(1-1)但不是来自产品 - &gt; OrderDetails(1-n)。

您的情况似乎相反,即允许1-n但不允许相应的1-1。我将创建一些测试,如果我可以重新编写它,它将在下一个版本中修复。

当发生这种情况时,我会在这里回复。 (和thx找到它:)。