尽管[BreezeQueryable(MaxExpansionDepth = 100)],深度扩展无法正常工作

时间:2013-11-28 10:59:53

标签: breeze

首先,我真的非常感谢开发者...... Breeze绝对太棒了,我不能为你的辛勤工作感谢你!

我一直在使用Breeze和EF(最新的Breeze,最新的EF)一段时间了,经过一些数据库更改后,我现在被迫查询第四层对象......起初,我点击了达到MaxExpansionDepth的错误,但根据SO上的几个问题/答案,我找到了[BreezeQueryable(MaxExpansionDepth = x)]属性。我已将此属性应用于控制器上的相关查询功能,从而消除了错误......但是,第四级的数据仍未填充。

我已经使用特定查询(基于4rth级别数据的键)成功检索了相关数据,并且在服务器端播放时一切正常...关系正常工作等...麻烦的查询如下:

function getPatient(patKey) {
    var query = breeze.EntityQuery
            .from("Patients")
            .where("Key", "==", patKey)
            .expand("..., ScanDates.Printouts.BMDSites, ...");

    return app.dataservice.manager.executeQuery(query);
}
BTW - 这对于一个病人来说都是如此,所以确实没有那么多的数据 - 它只是分开了很多!

如果有人有任何想法,我会非常感激!

干杯, 布拉德

P.S。:显然,我不需要“MaxExpansionDepth = 100”,但我也尝试过低值(4,5等)

编辑感谢Dominictus,我现在意识到真正的问题不在于查询的深度--BMDSites会在响应中回归,而不是实现实体而不管扩大深度。如果我只查询它们(即BMDSites,其中PrintoutKey = x),它们确实实现了......但是,这又导致10或15次访问服务器。我仍然想知道如何一次性获取所有内容,或者只是了解为什么这些内容不会在扩展中实现!

编辑2: 我刚刚想到Printout类是TPH继承层次结构的基类...看看其他一些问题,我怀疑这个可能是问题的根源。

2 个答案:

答案 0 :(得分:1)

原来它与继承或扩展的深度无关......在创建简化模型时,我当然发现它工作得很好。添加回我认为无关的功能,我最终打破了它,并通过添加一些[NotMapped]属性来复制我的问题,这些属性提供了对BMDSites列表的一些轻松访问。例如,在从Printout派生的类中:

    [NotMapped]
    public BMDSite _Ud = null;

    [NotMapped]
    public BMDSite Ud
    {
        get
        {
            if (_Ud == null)
            {
                _Ud = BMDSites.Find(b => b.Region == Region.Forearm_UD);
            }
            return _Ud;
        }
    }

重新添加后,我的BMDSites列表再次没有填充。事实证明,Breeze使用的JSON.net类不​​会看[NotMapped](这是有意义的,因为它是序列化,而不是数据库映射)...通过在我的EF模型中添加对JSON.net的引用,以及添加它的等效标记 - 即:[NotMapped,JsonIgnore],它不会查看属性,一切正常。

底线(对于那些浏览的人)...上面的代码导致问题,下面的代码工作正常:

    [NotMapped, JsonIgnore]
    public BMDSite _Ud = null;

    [NotMapped, JsonIgnore]
    public BMDSite Ud
    {
        get
        {
            if (_Ud == null)
            {
                _Ud = BMDSites.Find(b => b.Region == Region.Forearm_UD);
            }
            return _Ud;
        }
    }

干杯, 布拉德

答案 1 :(得分:0)

如果您对Patients操作使用其他一些查询,建议您复制Patients方法,将其命名为PatientsFull,并在其中.Include代替客户端{ {1}}。有时扩展不能按预期工作。 (如果这是expand的唯一查询,则只需更改该方法)

对于某些不同的想法,您必须记下任何可能出现在控制台中的错误。