我在我的SPA中使用Breeze取得了很大的成功,但是当尝试使用expand()在单个查询中返回parent->子数据时似乎陷入困境。
执行单个表查询时,JSON返回中的$ type是正确的:
$type: MySPA.Models.Challenge, MySPA
但是,如果我在查询中使用expand(),我会得到关系数据,但$ type是这样的:
System.Collections.Generic.Dictionary 2[[System.String, mscorlib],[System.Object, mscorlib]]
由于$ type不是正确的表+名称空间,因此客户端代码无法判断这是一个实体并将其公开为JSON而不是Breeze对象(具有observable,entityAspect等)。 / p>
起初我使用自己的ContextProvider,以便我可以覆盖Before / After保存方法。当我遇到这些问题时,我又回到了股票EFContextProvider<&gt ;.
我在数据库优先模式下使用EF5。
这是我的控制器代码:
[BreezeController]
public class DataController : ApiController
{
// readonly ModelProvider _contextProvider = new ModelProvider();
readonly EFContextProvider<TestEntities> _contextProvider = new EFContextProvider<TestEntities>();
[HttpGet]
public string Metadata()
{
return _contextProvider.Metadata();
}
[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
[HttpGet]
public IQueryable<Challenge> Challenges()
{
return _contextProvider.Context.Challenges;
}
[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{
return _contextProvider.SaveChanges(saveBundle);
}
public IQueryable<ChallengeNote> ChallengeNotes()
{
return _contextProvider.Context.ChallengeNotes;
}
}
这是我的BreezeWebApiConfig.cs
public static void RegisterBreezePreStart()
{
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "BreezeApi",
routeTemplate: "breeze/{controller}/{action}"
);
}
我缺少配置设置吗?
答案 0 :(得分:1)
您是否尝试在服务器端“扩展”?是否需要在客户端进行扩展?我之前尝试过扩展,但对我来说也失败了,做了一些研究并决定将其放在服务器上:
[HttpGet]
public IQueryable<Challenge> ChallengesWithNotes()
{
return _contextProvider.Context.Challenges.Include("ChallengeNotes");
}
应该按预期解析。在客户端,您将查询“ChallengeNotes”而不是“Challenges”,您不需要编写扩展部分。
答案 1 :(得分:0)
我强烈怀疑问题是由于您使用了[Queryable]
属性。
您必须改为使用[BreezeQueryable]
属性!
请参阅documentation on limiting queries。
我们知道Web API的
QueryableAttribute
已被弃用,转而支持Web API v.1.5中的EnableQueryAttribute
。请坚持BreezeQueryable
,直到我们有机会为EnableQuery
编写相应的派生属性。请查看文档以了解此开发的状态。