Javascript 如何在Breezejs中查询和扩展多态导航集合属性

Javascript 如何在Breezejs中查询和扩展多态导航集合属性,javascript,entity-framework,inheritance,odata,breeze,Javascript,Entity Framework,Inheritance,Odata,Breeze,我们第一次在现实世界的应用程序中使用Breeze,它是一个非常棒的框架。我们在继承方面遇到了问题,因为当查询具有多态导航集合的实体时,我们可以在JSON中看到派生类型返回的数据,但是该集合没有填充到客户端的Breeze实体中。我们在服务器上有C#类,实体框架使用每类型表策略将其持久化到数据库。有一个名为Client的基本抽象类,SpecialClient继承自该类: public abstract class Client { public int Id { ge

我们第一次在现实世界的应用程序中使用Breeze,它是一个非常棒的框架。我们在继承方面遇到了问题,因为当查询具有多态导航集合的实体时,我们可以在JSON中看到派生类型返回的数据,但是该集合没有填充到客户端的Breeze实体中。我们在服务器上有C#类,实体框架使用每类型表策略将其持久化到数据库。有一个名为Client的基本抽象类,SpecialClient继承自该类:

    public abstract class Client
    {
        public int Id { get; set; }
        public int QuoteID { get; set; } //Foreign Key for navigation

        public string FirstName { get; set; }
        public string FamilyName { get; set; }
    }

    public class SpecialClient : Client
    {
        public decimal Income { get; set; }
        public string ClientType { get; set; }
    }
然后我们有一个名为Quote的父类,它具有基本客户端的集合导航属性:

public class Quote
{
    public Quote()
    {
        Clients = new List<Client>();
    }

    public int Id { get; set; }
    public string Reference { get; set; }           
    public string Comments { get; set; }
    public DateTime EffectiveDate { get; set; }

    public List<Client> Clients { get; set; }
}
查看返回的实体时,我们有一个Quote实体,但客户端数组中没有填充任何客户端实体。我们已经检查了元数据,看起来不错,它知道基本类型和派生类型,并且我们已经检查了Quote和Client之间是否映射了外键,这也反映在元数据中。我们还检查了查询产生的JSON,同样,一切看起来都很好,客户机导航集合填充在Quote实体上。当查询返回数据时,Breeze似乎不会填充实体

我们尝试删除从客户端继承的SpecialClient类,然后我们得到了一个填充了基本客户端实体的集合,因此它看起来确实与继承相连接。我们还尝试查看是否可以查询派生的SpecialClient,但似乎无法解决如何在导航属性中查询派生类型,该属性指定了带谓词的基类型:

var pred = new breeze.Predicate("Clients", "any", "clientType", "==", 'Life1'));
我们不确定如何指定要查询SpecialClient派生类型。当我们尝试上述方法时,Breeze抱怨客户端没有clientType属性

如果有人能就如何处理这种类型的继承查询和扩展问题以及我们哪里出了问题或者这是一个bug(非扩展部分),提供建议,我将不胜感激。我们正在使用WebAPI2(5.0.1)、Breeze(带有EF6上下文提供程序)1.4.11,并且我们已经检查了所有客户端和服务器包是否都是1.4.11

我们如何指示Breeze在导航集合中有派生类型,并希望查询和检索它们

非常感谢你的帮助


编辑1:还应提到,我们没有使用基本约定以外的任何特殊EF映射。

我还没有详细研究过这一点,但在我们的DocCode示例中,我们在客户和订单/国际订单之间有类似的关系,其中Customer.Orders属性可以返回Orders或InternationalOrders。看看那个样品,看看它和你的有什么不同

通过查看DocCode示例,我们似乎已经解决了这个问题。事实证明,我们没有从基类客户机返回到principle类Quote的引用导航,principle类Quote包含基类客户机的导航集合:

public abstract class Client
{
    public int Id { get; set; }
    public int QuoteId { get; set; } //Foreign Key for navigation

    public string FirstName { get; set; }
    public string FamilyName { get; set; }

    public Quote quote { get; set; }    //Added this nav property back to Quote principle!
}
虽然我们有一个QuoteId属性作为原则的外键,但看起来我们还需要一个引用来引用基本客户机类。现在,我们可以使用expand进行查询,并且Clients集合中填充了派生类型。这是在Breeze中实现这种建模的正确方法吗?另外,在Breeze网站文档中添加一个关于继承的部分是一个好主意,还是对特定的后端ORM选择过于具体

在相关注释中,是否可以对派生类型的属性执行查询限制(where或谓词)?我们通过将查询推送到服务器存储库并使用OfType()执行LINQ Where以获取我们想要限制的属性来解决这个问题,我们想知道Breeze是否可以在客户端执行此操作(我们在文档中看不到任何清晰的内容)


感谢您的帮助,并与Breeze一起继续出色的工作,我们非常喜欢这个框架

嗨,杰,非常感谢你的快速回复。实际上,我们已经下载了DocCode示例,在检查NorthBreeze解决方案时,我们可以看到InternationalOrder并没有从Order物理继承,即我们希望看到公共类InternationalOrder:Order。我们是否做错了,是否应该让SpecialClient不从客户端继承,或者这是特定于nHibernate而不是我们正在使用的实体框架的东西。此外,尽管我们没有引用该事件的导航属性,但是否有可能查询派生实体事件?抱歉,我们下载了错误的示例,现在有运行单元测试的.NET示例。我们似乎在做正确的事情,并且我们遵循与TPT的BillingDetails示例相同的原则,但仍然没有运气。作为一个实验,你能让客户非抽象化,看看会发生什么吗?是的,我们尝试过,但仍然不起作用。只有当我们将继承从SpecialClient删除到Client时,它才起作用。好吧,如果您可以在DocCode上重新创建问题,我可能可以修复它,但到目前为止,我无法重新创建您的问题。(您也可以联系breeze@ideablade.com支持选项)。
var pred = new breeze.Predicate("Clients", "any", "clientType", "==", 'Life1'));
public abstract class Client
{
    public int Id { get; set; }
    public int QuoteId { get; set; } //Foreign Key for navigation

    public string FirstName { get; set; }
    public string FamilyName { get; set; }

    public Quote quote { get; set; }    //Added this nav property back to Quote principle!
}