微风& EFContextProvider - 如何在使用expand()时正确返回$ type?

时间:2013-11-12 15:12:14

标签: entity-framework-5 breeze

我在我的SPA中使用Breeze取得了很大的成功,但是当尝试使用expand()在单个查询中返回parent->子数据时似乎陷入困境。

执行单个表查询时,JSON返回中的$ type是正确的:

$type: MySPA.Models.Challenge, MySPA without Expand

但是,如果我在查询中使用expand(),我会得到关系数据,但$ type是这样的:

System.Collections.Generic.Dictionary 2[[System.String, mscorlib],[System.Object, mscorlib]]

with Expand

由于$ 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}"
      );
  }

我缺少配置设置吗?

2 个答案:

答案 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编写相应的派生属性。请查看文档以了解此开发的状态。