Asp.net web api 微风-在对象#中展开结果<;对象>;没有方法';getProperty';查询失败
在我的edmx模型中有两个相关的表:ChallengeNote和ChallengeNote(将FK返回ChallengeID) 我可以整天在微风中做这件事Asp.net web api 微风-在对象#中展开结果<;对象>;没有方法';getProperty';查询失败,asp.net-web-api,entity-framework-5,breeze,Asp.net Web Api,Entity Framework 5,Breeze,在我的edmx模型中有两个相关的表:ChallengeNote和ChallengeNote(将FK返回ChallengeID) 我可以整天在微风中做这件事 var qry=dataservice.getQuery(“挑战”) 但是,每次都会失败: var qry=dataservice.getQuery(“挑战”).expand(“挑战”) 将调用searchFailed,这是控制台中唯一的错误信息 return dataservice.execute(qry.inlineCount(true)
var qry=dataservice.getQuery(“挑战”)代码>
但是,每次都会失败:
var qry=dataservice.getQuery(“挑战”).expand(“挑战”)代码>
将调用searchFailed,这是控制台中唯一的错误信息
return dataservice.execute(qry.inlineCount(true))
.then(seachSucceeded)
.fail(searchFailed);
- Breeze支持这样的关系数据吗李>
- 需要编写一些自定义代码来支持吗
- 我错过了什么李>
这里是相关的回答问题,但我已经在遵循(除非我遗漏了什么)答案的解决方案(以及为什么我的ContextProvider中有2 context.Configuration设置)。
还有一个类似的问题没有得到回答
以下是我的提供程序代码(希望在项目中进一步使用BeforeSaveEntity覆盖):
公共类模型提供程序:EFContextProvider
{
公共模型提供者()
: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;
}
}
[BreezeController]
公共类数据控制器:ApiController
{
只读模型提供者_contextProvider=新模型提供者();
[HttpGet]
公共字符串元数据()
{
返回_contextProvider.Metadata();
}
[可查询(AllowedQueryOptions=AllowedQueryOptions.All)]
[HttpGet]
公众可接受的挑战()
{
return\u contextProvider.Context.Challenges.Include(x=>x.ChallengeNotes);
}
[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{
return\u contextProvider.SaveChanges(saveBundle);
}
[HttpGet]
公共可查询的挑战者()
{
return_contextProvider.Context.ChallengeNotes;
}
}
当我浏览到URL时,它包括相关实体:
http://localhost:53644/breeze/data/Challenges?$filter=Active%20eq%20true&$top=10&$expand=ChallengeNotes&$inlinecount=allpage
这是来自控制器的数据
在这一点上,imo所有的东西都指向服务器或客户端上的Breeze配置
TIABreeze绝对支持这一点,但您确实需要确保您的实体框架模型设置正确。查看Breeze zip中的DocCode示例,了解使用expand(客户端)或EF include(服务器端)子句的许多示例
关于您的问题的一个猜测是您正在使用命名约定,因此您的“expand”子句应该是
var qry = dataservice.getQuery("Challenges").expand("challengeNotes");
i、 e.“challengeNotes”(注意大小写)是与“challengeNotes”的服务器端属性相对应的客户端属性的名称。为了澄清这一点,“expand”子句将客户端“properties”的名称作为参数,属性名称是Breeze.NamingConvention转换的结果
相反,在您的示例中,查询资源名称(即“Challenges”)是服务器端资源的名称(这是使用[HttpGet]注释标记“Challenges”方法的结果。此名称不受NamingConvention的影响)
旁注:您的示例既有一个expand子句,也有一个Include子句。这两个子句中的任何一个单独就足够了。您不需要这两个。通常,您可以在客户端查询中包含一个“expand”子句,也可以使用一个实体框架“Include”第一种方法的优点是可以控制客户机上的扩展,第二种方法的优点是可以确保对指定资源的每个查询始终获取一些相关实体
希望这能有所帮助!谢谢你的回复。因为我是一名C#guy,所以我一直在保留外壳以匹配我的DB。根据你的反馈,我的第一次尝试是将其更改为.expand('challengeNotes)
,我从我的WebAPI中得到了一个404。因此我添加了NamingConvention.camelCase.setAsDefault()
并尝试使用challengeNotes。现在,我在网页中遇到以下错误:无法在entityType:Challenge:#WebApp.Models查询失败
(Challenge具有活动字段)在Chrome F12工具中,我没有看到向服务器发送的请求。我确实验证了从我的WebAPI发送的元数据。我的上一个错误是因为大小写错误。因此,我重构了客户端代码以使用camelCasing,但仍然存在问题。在将代码与示例进行比较时,我注意到我没有元数据存储。因此我添加了var store=new breeze.MetadataStore();var manager=new breeze.EntityManager({serviceName:serviceName,MetadataStore:store});
到我的dataservice.js文件。我几乎做到了——没有错误,我的数据返回(带注释!),但我现在用我的数据获得属性,而不是observable()和以前一样。-我缺少一个设置吗?我尝试了各种不同的组合-但始终是这样:--如果我有扩展,我得到的是关系结果,但它们只是JS对象,没有entityAspect属性。如果我没有扩展,我得到的实体首先是字段的可忽略的可观察对象我要做的是从您的服务器代码中删除“.Include(x=>x.ChallengeNotes”,因为它隐藏了“expand”您正在尝试执行。接下来,如果Breeze找不到在元数据存储中定义的实体类型,并且该实体的名称与返回给客户端的json中的名称相匹配,那么您将获得一个不可观察的实体。在这种情况下,Breeze会假设返回的是一个投影,而只返回一个原始数据vascript对象。请参阅MetadataStore.setEntityTypeForResourceName方法和文档
var qry = dataservice.getQuery("Challenges").expand("challengeNotes");