错误按需加载相关实体(entityAspect.loadNavigationProperty())

时间:2013-02-28 21:00:36

标签: breeze

我正在使用durandaljs和breezejs进行应用程序。我试图获得导航属性的值。我的问题是当我试图在微风中调用这个方法时:

user.entityAspect.loadNavigationProperty("userType");

我收到错误“”'propertyOrExpr'参数必须是'string'“”。对于以下代码部分,抛出此错误:

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'中的所有其余字段都已填充,但我不知道为什么,但我的服务器不发送此信息。 (还有foreignKeyNamesServer为空)。

有人有同样的问题吗?可能是微风的错误吗?

感谢。

2 个答案:

答案 0 :(得分:2)

昨天我找到了解决方案,我没有时间刷新它。问题在于我的用户类的定义。我首先使用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;}
}

这样做,我解决了这个问题。但是,我可以为多对多关系实现此解决方案。我发现,进行一些研究,目前不支持多对多关系。 所以我唯一能做的就是实现多对多的中间实体。

非常感谢沃德的时间。如果有任何其他方法可以解决这个问题,我会很高兴听。感谢。

答案 1 :(得分:0)

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

实际上,为了正确提供帮助,我们必须看到User的类定义,即来自描述UserUserType的服务器的元数据部分(请不要打印整个元数据!)以及EntityType

在运行时返回的manager.metadataStore.getEntityType('User')对象的快照