Breeze - 在Object#<object>中展开结果没有方法'getProperty'查询失败</object>

时间:2013-11-08 22:30:16

标签: asp.net-web-api entity-framework-5 breeze

在我的edmx模型中有两个相关的表:Challenge和ChallengeNote(让FK回到ChallengeID)

我可以整天在微风中做到这一点

var qry = dataservice.getQuery("Challenges");

但是,每次都失败了:

var qry = dataservice.getQuery("Challenges").expand("ChallengeNotes");

调用searchFailed,它是控制台中唯一的错误信息。

return dataservice.execute(qry.inlineCount(true))
        .then(seachSucceeded)
        .fail(searchFailed);
  • Breeze是否支持这样的关系数据?
  • 是否需要编写一些自定义代码才能支持?
  • 我错过了什么?

这是相关的回答问题,但我已经关注(除非我遗漏了一些东西)答案的解决方案(以及为什么我在ContextProvider中有2个context.Configuration设置)。 breezejs-error-when-loading-an-entity-with-related-data

这是另一个类似的问题,未经答复breeze-expand-query-fails-with-object-object-has-no-method-getproperty

这是我的提供者代码(想要在项目中进一步使用BeforeSaveEntity覆盖):

public class ModelProvider : EFContextProvider<ModelEntities>
{
    public ModelProvider()
        : base() 
    {
        this.Context.Configuration.LazyLoadingEnabled = false;
        this.Context.Configuration.ProxyCreationEnabled = false;            
    }
}

这是我的控制器代码:

[BreezeController]
public class DataController : ApiController
{
    readonly ModelProvider _contextProvider = new ModelProvider();

    [HttpGet]
    public string Metadata()
    {
        return _contextProvider.Metadata();
    }

    [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
    [HttpGet]
    public IQueryable<Challenge> Challenges()
    {
        return _contextProvider.Context.Challenges.Include(x => x.ChallengeNotes);
    }

    [HttpPost]
    public SaveResult SaveChanges(JObject saveBundle)
    {
        return _contextProvider.SaveChanges(saveBundle);
    }

    [HttpGet]
    public IQueryable<ChallengeNote> ChallengeNotes()
    {       
        return _contextProvider.Context.ChallengeNotes;
    }
}

当我浏览到URL时,它包括相关实体: http://localhost:53644/breeze/data/Challenges?$filter=Active%20eq%20true&$top=10&$expand=ChallengeNotes&$inlinecount=allpages

以下是来自Controller的数据 json results

此时,所有内容imo都指向服务器或客户端上的Breeze配置。

TIA

1 个答案:

答案 0 :(得分:2)

Breeze绝对支持这一点,但您确实需要确保正确设置了Entity Framework模型。查看Breeze zip中的DocCode示例,了解使用expand(客户端)或EF include(服务器端)子句的大量示例。

关于您的问题的一个猜测是您正在使用Breeze camelCasing命名约定,因此您的“expand”子句应该是

var qry = dataservice.getQuery("Challenges").expand("challengeNotes");

即。 “challengeNotes”(注意大小写)是客户端属性的名称,它对应于“ChallengeNotes”的服务器端属性。为了澄清,“expand”子句将客户端“属性”的名称作为参数,属性名称是由Breeze.NamingConvention转换而来的。

相比之下,您的示例中的查询资源名称即“Challenges”是服务器端资源的名称(作为使用[HttpGet]注释标记“Challenges”方法的结果。此名称不受NamingConvention。

附注:您的示例包含expand和Include子句。这些中的任何一个本身就足够了。你不需要两者。通常,您可以在客户端查询中包含“expand”子句,或者在服务器上具有实体框架“Include”子句。第一个优点是您可以控制客户端的扩展,第二个优点是您可以确保指定资源的每个查询始终获取一些相关实体。

希望这有帮助!