Breeze 按需加载相关实体时出错(entityAspect.loadNavigationProperty())

Breeze 按需加载相关实体时出错(entityAspect.loadNavigationProperty()),breeze,Breeze,我正在用durandaljs和breezejs做一个应用程序。我正在尝试获取导航属性的值。我的问题是,当我试图在breeze中调用此方法时: user.entityAspect.loadNavigationProperty("userType"); 我得到错误“propertyOrExpr”参数必须是“字符串”。以下代码部分将抛出此错误: var q = new EntityQuery(navProperty.entityType.defaultResourceName); var pred

我正在用durandaljs和breezejs做一个应用程序。我正在尝试获取导航属性的值。我的问题是,当我试图在breeze中调用此方法时:

user.entityAspect.loadNavigationProperty("userType");
我得到错误“propertyOrExpr”参数必须是“字符串”。以下代码部分将抛出此错误:

var q = new EntityQuery(navProperty.entityType.defaultResourceName);
var pred = buildNavigationPredicate(entity, navProperty);
q = q.where(pred);
问题是'pred'为空,因为'buildNavigationPredicate'返回null。进入“buildNavigationPredicate”:

if (navigationProperty.foreignKeyNames.length === 0) return null;
问题是'foreignKeyNames'数组为空,'navigationProperty'中的所有rest字段都已填充,但我不知道为什么,但我的服务器没有发送此信息。(foreignKeyNamesServer也是空的)

有人有同样的问题吗?它会是微风中的虫子吗


谢谢。

错误消息没有帮助。幸运的是,您已将问题归咎于缺少外来关键字。这表明导航属性的定义中缺少某些内容。出于某种原因,Breeze没有检测到
User
中与
UserType
相关的FK属性。如果您使用的是Web API和EF,则可以确认在服务器上正确指定了FK


实际上,为了正确地提供帮助,我们必须查看
User
的类定义,服务器中描述
User
UserType
的元数据部分(请不要打印整个元数据!)以及运行时从
manager.metadataStore.getEntityType('User')返回的
EntityType
对象的快照。我昨天找到了解决方案,没有时间刷新它。问题在于我的用户类的定义。我首先使用Web API和EF代码。我以前的用户类是:

    public class User
{
    public Guid Id { get; set;}
    public string UserName { get; set; }
    public string Password { get; set; }
    public bool Active { get; set; }

    public virtual UserType UserType { get; set;}
}
要对user.loadNavigationProperty('userType')执行操作,我必须在以下位置更改旧的用户类:

    public class User
{
    public Guid Id { get; set;}
    public string UserName { get; set; }
    public string Password { get; set; }
    public bool Active { get; set; }

    public Guid UserType_Id { get; set; }

    [ForeignKey("UserType_Id")]
    public virtual UserType UserType { get; set;}
}
这样,我解决了问题。但是,我可以为多对多关系实现此解决方案。我做了一点研究,发现breeze目前不支持多对多关系。 所以我唯一能做的就是在多对多关系中实现一个中间实体


非常感谢沃德抽出时间。如果有任何其他方法来解决这个问题,我将非常乐意倾听。谢谢。

你好,沃德,谢谢你的帮助。我自己找到了解决办法。然而,我想知道为什么我必须这样做来解决这个问题。如果有任何不同的方法来解决问题,也有任何方法来解决多对多关系问题。谢谢。在EF允许您补充其惯例之前,我将对您的回答进行评论/解释。我不知道还有其他选择。人类会在心里擦除
UserType\u Id
中的下划线(u);EF没有。如果属性名为UserTypeId,EF就会找到它。顺便说一句,如果您不想在模型类代码中使用面向数据库的属性(我知道我不想),您可以使用EF fluent API帮助EF理解您的模型。我们知道有些人希望Breeze支持多对多。它有一个用户语音项。我希望人们放弃这一要求,我们永远不会执行它。如果你们真的想要的话,我们必须这么做。但我认为这是一个可怕的想法。。。作为。跟着中间实体走,心存感激。。。因为总有一天你会为你所做的感到高兴。非常感谢你的回答。我使用的是fluentapi;然而,我认为使用注释来解释我的解决方案会更容易。关于多对多关系,我可以看出你的观点;我将实现中间实体。谢谢,它帮助我澄清了很多。