【问题标题】:Breeze API Error Unable to locate member: When filtering on expanded entityBreeze API 错误无法找到成员:在扩展实体上过滤时
【发布时间】:2013-06-18 19:53:00
【问题描述】:

我收到错误:

Unable to locate member:

在对展开的实体属性进行过滤时。

这行得通:

http://localhost:60760/XXX/XXX/productcollection?$filter=Code%20eq%20'da'&$expand=PRODUCT_LINE

然后返回:

[{"$id":"1","$type":"DoorDesigner.Models.COLLECTION, DoorDesigner","ID":81,"Descr":"Some Description","Code":"Da","DISPLAY_HTML":"","DEFAULT_IMAGE_PATH":"../Content/Images/TempCollections/0000_Layer 54.jpg","PRODUCT_LINE":[{"$id":"2","$type":"DoorDesigner.Models.PRODUCT_LINE, DoorDesigner","ID":213,"CollectionID":81,"Code":"AT","Descr":"ATHENA","LongDescr":"ATHENA","DEFAULT_IMAGE_PATH":"../Content/Images/TempCollections/0000_Layer%2054.jpg","Product_Code_Group":"AT","COLLECTION":{"$ref":"1"},"PRICING_DOOR":[],"POSSIBLE_INSULATION":[],"POSSIBLE_WINDOW":[],"WINDOWs":[]},{"$id":"3","$type":"DoorDesigner.Models.PRODUCT_LINE, DoorDesigner","ID":217,"CollectionID":81,"Code":"CY","Descr":"CYPRUS","LongDescr":"CYPRUS","DEFAULT_IMAGE_PATH":"../Content/Images/TempCollections/Panel.jpg","Product_Code_Group":"CY","COLLECTION":{"$ref":"1"},"PRICING_DOOR":[],"POSSIBLE_INSULATION":[],"POSSIBLE_WINDOW":[],"WINDOWs":[]},{"$id":"4","$type":"DoorDesigner.Models.PRODUCT_LINE, DoorDesigner","ID":220,"CollectionID":81,"Code":"PI","Descr":"PINNACLE","LongDescr":"PINNACLE","DEFAULT_IMAGE_PATH":"../Content/Images/TempCollections/Windows.jpg","Product_Code_Group":"PI","COLLECTION":{"$ref":"1"},"PRICING_DOOR":[],"POSSIBLE_INSULATION":[],"POSSIBLE_WINDOW":[],"WINDOWs":[]},{"$id":"5","$type":"DoorDesigner.Models.PRODUCT_LINE, DoorDesigner","ID":227,"CollectionID":81,"Code":"WI","Descr":"WINDRIVER","LongDescr":"WINDRIVER","DEFAULT_IMAGE_PATH":"../Content/Images/TempCollections/Panel.jpg","Product_Code_Group":"WI","COLLECTION":{"$ref":"1"},"PRICING_DOOR":[],"POSSIBLE_INSULATION":[],"POSSIBLE_WINDOW":[],"WINDOWs":[]}]}]

注意,PRODUCT_LINE 已展开,并且有一个 Descr 属性。

现在,如果我更改 URL 以过滤 PRODUCT_LINE.Descr,我会收到错误消息:

http://localhost:60760/XXX/XXX/productcollection?$filter=PRODUCT_LINE/Descr%20eq%20'Athena'&$expand=PRODUCT_LINE 

返回:

{"$id":"1","$type":"System.Web.Http.HttpError, System.Web.Http","Message":"An error has occurred.","ExceptionMessage":"Unable to locate member: Descr","ExceptionType":"System.Exception","StackTrace":"   at Breeze.WebApi.ParseTreeVisitor.VisitMemberExpr(ParseTreeNode node, Expression targetExpr, String memberName)\r\n   at Breeze.WebApi.ParseTreeVisitor.<>c__DisplayClass3.<VisitNode>b__0(ParseTreeNode n)\r\n   at System.Collections.Generic.List`1.ForEach(Action`1 action)\r\n   at Breeze.WebApi.ParseTreeVisitor.VisitNode(ParseTreeNode node)\r\n   at Breeze.WebApi.ParseTreeVisitor.VisitNode(ParseTreeNode node)\r\n   at Breeze.WebApi.ParseTreeVisitor.Parse(Type rootType, ParseTreeNode node)\r\n   at Breeze.WebApi.ExpressionTreeBuilder.Parse(Type rootType, String source)\r\n   at Breeze.WebApi.ODataActionFilter.BuildFilterFunc(String filterQueryString, Type elementType)\r\n   at Breeze.WebApi.ODataActionFilter.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)\r\n   at System.Web.Http.Filters.ActionFilterAttribute.CallOnActionExecuted(HttpActionContext actionContext, HttpResponseMessage response, Exception exception)\r\n   at System.Web.Http.Filters.ActionFilterAttribute.<>c__DisplayClass2.<System.Web.Http.Filters.IActionFilter.ExecuteActionFilterAsync>b__0(HttpResponseMessage response)\r\n   at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass41`2.<Then>b__40(Task`1 t)\r\n   at System.Threading.Tasks.TaskHelpersExtensions.ThenImpl[TTask,TOuterResult](TTask task, Func`2 continuation, CancellationToken cancellationToken, Boolean runSynchronously)"}

据我所知,这是产生错误的 Breeze 代码。

protected virtual Expression VisitMemberExpr(ParseTreeNode node, Expression targetExpr, String memberName) {
  var targetType = targetExpr.Type;
  var member = targetType.GetMember(memberName).FirstOrDefault();
  if (member == null) {
    throw new Exception("Unable to locate member: " + memberName);
  }
  return Expression.MakeMemberAccess(targetExpr, member);
}

这发生在我的 API 中,在我尝试过滤扩展属性的任何地方。有没有人成功过滤这些?

更新: 这是实体查询:

breeze.EntityQuery.from('ProductCollection') .where('PRODUCT_LINE.Descr', '==', 'Athena') .expand('PRODUCT_LINE');

APIController 中的 AND

[HttpGet] public IQueryable<COLLECTION> productCollection() { return _contextProvider.Context.COLLECTIONs; }

上下文定义:

public DbSet&lt;COLLECTION&gt; COLLECTIONs { get; set; }

最后是类定义

public partial class COLLECTION
{
    public COLLECTION()
    {
        this.PRODUCT_LINE = new HashSet<PRODUCT_LINE>();
    }

    public int ID { get; set; }
    public string Descr { get; set; }
    public string Code { get; set; }
    public string DISPLAY_HTML { get; set; }
    public Nullable<System.DateTime> CREATED { get; set; }
    public string CREATOR { get; set; }
    public Nullable<System.DateTime> LAST_MODIFIED { get; set; }
    public string LAST_USER { get; set; }
    public string DEFAULT_IMAGE_PATH { get; set; }
    public Nullable<bool> IS_DELETED { get; set; }

    public virtual ICollection<PRODUCT_LINE> PRODUCT_LINE { get; set; }
}

public partial class PRODUCT_LINE
{
    public PRODUCT_LINE()
    {
        this.PRICING_DOOR = new HashSet<PRICING_DOOR>();
        this.POSSIBLE_INSULATION = new HashSet<POSSIBLE_INSULATION>();
        this.POSSIBLE_WINDOW = new HashSet<POSSIBLE_WINDOW>();
        this.WINDOWs = new HashSet<WINDOW>();
    }

    public int ID { get; set; }
    public Nullable<int> CollectionID { get; set; }
    public string Code { get; set; }
    public string Descr { get; set; }
    public string LongDescr { get; set; }
    public string DISPLAY_HTML { get; set; }
    public Nullable<System.DateTime> CREATED { get; set; }
    public string CREATOR { get; set; }
    public Nullable<System.DateTime> LAST_MODIFIED { get; set; }
    public string LAST_USER { get; set; }
    public string DEFAULT_IMAGE_PATH { get; set; }
    public Nullable<bool> IS_DELETED { get; set; }
    public string Product_Code_Group { get; set; }
    public Nullable<int> DefaultInsulationId { get; set; }
    public Nullable<int> DefaultWindowId { get; set; }

    public virtual COLLECTION COLLECTION { get; set; }
    public virtual ICollection<PRICING_DOOR> PRICING_DOOR { get; set; }
    public virtual ICollection<POSSIBLE_INSULATION> POSSIBLE_INSULATION { get; set; }
    public virtual ICollection<POSSIBLE_WINDOW> POSSIBLE_WINDOW { get; set; }
    public virtual ICollection<WINDOW> WINDOWs { get; set; }
}

谢谢,

【问题讨论】:

  • 请发布您的实体查询的副本。我认为问题与您试图过滤尚未扩展的扩展实体中的属性有关,但如果您可以发布您的实体查询,我可以帮助确认(或拒绝:))跨度>
  • breeze.EntityQuery.from('ProductCollection') .orderBy('Descr') .where('PRODUCT_LINE.Descr', '==', 'Athena') .expand('PRODUCT_LINE');
  • 那么 ProductCollection 有 PRODUCT_LINE 有 Descr 吗?

标签: knockout.js odata breeze single-page-application


【解决方案1】:

关于此的一件事对我来说没有意义 - 您的 ProductCollection 是 Product 的集合还是 ProductCollection 类型的实体?

编辑

在您的 ApiController 中,您将 ProductCollection 命名为 productCollection,这是故意还是错字?此外,您的 PRODUCT_LINE 集合称为 PRODUCT_LINE,有人会认为您打算将其命名为 PRODUCT_LINES。最后,你的 ForeignKey 可以为空(CollectionId),你确定它不为空吗?

【讨论】:

  • 它实际上有一个名为 Descr 的字段,我知道这个名字令人困惑,它是一个产品集合 (PRODUCT_LINES)。我将定义添加到原始帖子中。这仍然是错误:`query = blink.EntityQuery.from('ProductCollection') .where('PRODUCT_LINE.Descr', '==', 'Athena') .expand('PRODUCT_LINE');`
  • 而且您没有使用 camelCase 作为默认值还是正确的?
  • 不,不过很有趣。我在 camelCase 函数 configureBreezeManager() { // 这导致微风错误,指出服务器“密钥”和客户端“密钥”名称不匹配(密钥来自元数据......)//微风.NamingConvention.camelCase.setAsDefault(); var mgr = 新微风.EntityManager(config.remoteServiceName); model.configureMetadataStore(mgr.metadataStore);返回经理; }
  • 好吧,最后一个问题,在您的 ApiController 中,您将 ProductCollection 命名为 productCollection,这是故意还是错字?此外,您的 PRODUCT_LINE 集合称为 PRODUCT_LINE,有人会认为您打算将其命名为 PRODUCT_LINES。最后,你的 ForeignKey 可以为空(CollectionId),你确定它不为空吗?
  • 这是一个错字,与我的 camelCasing 被注释掉有关。我修复了大小写错误,但仍然是同样的问题。我们使用的是 EF,它不是 PRODUCT_LINE 的复数形式。厌倦了每次模型更新都进行更改...您认为这可能是问题吗?另外,查看数据,ForiegnKey 不为空。
【解决方案2】:

我能够解决此错误。不知何故,我引用了 Breeze 1.1.2,它并没有显示它在包管理器中有任何更新。我终于意识到,如果我搜索微风,它会发现 v 1.3.6 是当前版本(无论如何我都认为该项目正在进行中)。

对当前版本的微风的更新解决了该问题。

kadumel => 感谢您的宝贵意见!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    相关资源
    最近更新 更多