我的EDM中有两个实体,Application
和Address
非常类似于以下内容:
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不支持一对多的单向?
答案 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找到它:)。