我正在使用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为空)。
有人有同样的问题吗?可能是微风的错误吗?
感谢。
答案 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
的类定义,即来自描述User
和UserType
的服务器的元数据部分(请不要打印整个元数据!)以及EntityType
manager.metadataStore.getEntityType('User')
对象的快照