Knockout.js observablearray中的子实体未创建为;“可依赖于服务”;

Knockout.js observablearray中的子实体未创建为;“可依赖于服务”;,knockout.js,breeze,Knockout.js,Breeze,嗯,我觉得好像不对。我有一个breeze查询,可以执行以下操作: var query = new breeze.EntityQuery() .from("AllGames") .expand("Sets, MVP, TeamerMVP.Person") .orderBy("GameDateTime desc"); (每场比赛可以没有或有多个Te

嗯,我觉得好像不对。我有一个breeze查询,可以执行以下操作:

             var query = new breeze.EntityQuery()
                     .from("AllGames")
                     .expand("Sets, MVP, TeamerMVP.Person")
                     .orderBy("GameDateTime desc");
(每场比赛可以没有或有多个TeamerMVP记录,并且与person表存在一对一的关系,因此TeamerMVP.person的expand语句可以让我直接亲自访问“Name”属性。这在直接一对一相关的MVP(每场比赛只能有一个)中非常有效。)

所有这些看起来都很好——相关的实体已经加载,我也可以在原型函数中访问子实体。然而,我在尝试对子实体进行html绑定时遇到了很多问题,在chrome的控制台中检查时,可能是因为子实体不像父实体那样声明为DependentoServable,它们只是简单的“对象”

控制台中的评估:

$data
    Object
        games: Object[0]
        _latestValue: Array[7]
        0: Game
        1: Game
        2: Game
            >GameDateTime: function dependentObservable() {
            >HomeGame: function dependentObservable() {
            >ID: function dependentObservable() {
            >LeagueGame: function dependentObservable() {
            >MVP: function dependentObservable() {
            >MVP_PersonID: function dependentObservable() {
            >NLorRL: "<strong>NL</strong> (A)"
            >Opponent: function dependentObservable() {
            >Sets: Object[0]
            >TeamerMVP: Object[0]
在relatedperson表中很容易看到“Name”属性

编辑以添加: 麻烦的只是“团队关系”。只是设法在“集合”实体上使用“forEach”做了一些事情,这样就可以很好地工作了,即使它不是一个dependentobservable。。。。我很困惑

进一步编辑沃德的问题:

根据要求,在断点处,我看到以下内容:

breezeConfig.manager.metadataStore._structuralTypeMap
Object
  >Game:#lbD.model: ctor
  >GameSet:#lbD.model: ctor
  >Person:#lbD.model: ctor
  >TeamerMVP:#lbD.model: ctor
  >Venue:#lbD.model: ctor
  >__proto__: Object
这些是我(简单)数据库中的具体表名。如果我展开“GameSet”,则其中一个属性是:defaultResourceName:“Sets”,这是导航属性名称(在模型中定义为“Public Overridable property set(),作为(游戏集的)ICollection”)

啊。。。刚刚扩展了“TeamerMVP”,它的defaultresourcename是“TeamerMVPs”,这是一个很小但很微妙的区别!我不记得在任何地方定义了一个末尾带有“s”的版本,快速搜索项目都不会显示任何结果。好奇。也许这就是问题所在,我现在将快速使用html绑定

编辑3:HTML绑定信息

不,根本不打球

我有这个模板:

 <script type="text/html" id="TeamerMVPTemplate">
    <div>Teamer MVP(s):&nbsp;</div>
    <li data-bind="text: Person().Name"></li>
</script>
TeamerMVP模型

Public Class Game
    Public Property ID() As Integer
    Public Property GameDateTime() As System.DateTime
    Public Property Opponent() As String
    Public Property HomeGame() As Boolean
    Public Property LeagueGame() As Boolean
    Public Property MVP_PersonID() As Nullable(Of Integer)
    Public Property VenueID() As Nullable(Of Integer)
    Public Property isNL() As Boolean

    Public Overridable Property Sets() As ICollection(Of GameSet)
    Public Overridable Property MVP() As Person
    Public Overridable Property TeamerMVP() As ICollection(Of TeamerMVP)
    Public Overridable Property Venue() As Venue
End Class
Public Class TeamerMVP
    Public Property GameID() As Integer
    Public Property PersonID() As Integer

    Public Overridable Property Person() As Person
End Class
Public Class Person
    Public Property ID() As Integer
    Public Property Name() As String
    Public Property isAdmin() As Boolean
    Public Property email() As String
    Public Property type() As String
    Public Property Image() As String
    Public Property thumbImage() As String
    Public Property backImage1() As String
    Public Property backImage2 As String
    Public Property Height() As String
    Public Property YearStarted() As String
    Public Property Position() As String
    Public Property PreviousClubs() As String
    Public Property ShirtNumber() As String
    Public Property isNL() As Boolean

    Public Overridable Property Games_MVP() As ICollection(Of Game)
    Public Overridable Property Games_TeamerMVP() As ICollection(Of Game)
End Class
Public Class GameSet
    Public Property ID() As Integer
    Public Property GameID() As Integer
    Public Property SetNo() As Integer
    Public Property ourScore() As Integer
    Public Property theirScore() As Integer

    Public Overridable Property Game() As Game
End Class
人物模型

Public Class Game
    Public Property ID() As Integer
    Public Property GameDateTime() As System.DateTime
    Public Property Opponent() As String
    Public Property HomeGame() As Boolean
    Public Property LeagueGame() As Boolean
    Public Property MVP_PersonID() As Nullable(Of Integer)
    Public Property VenueID() As Nullable(Of Integer)
    Public Property isNL() As Boolean

    Public Overridable Property Sets() As ICollection(Of GameSet)
    Public Overridable Property MVP() As Person
    Public Overridable Property TeamerMVP() As ICollection(Of TeamerMVP)
    Public Overridable Property Venue() As Venue
End Class
Public Class TeamerMVP
    Public Property GameID() As Integer
    Public Property PersonID() As Integer

    Public Overridable Property Person() As Person
End Class
Public Class Person
    Public Property ID() As Integer
    Public Property Name() As String
    Public Property isAdmin() As Boolean
    Public Property email() As String
    Public Property type() As String
    Public Property Image() As String
    Public Property thumbImage() As String
    Public Property backImage1() As String
    Public Property backImage2 As String
    Public Property Height() As String
    Public Property YearStarted() As String
    Public Property Position() As String
    Public Property PreviousClubs() As String
    Public Property ShirtNumber() As String
    Public Property isNL() As Boolean

    Public Overridable Property Games_MVP() As ICollection(Of Game)
    Public Overridable Property Games_TeamerMVP() As ICollection(Of Game)
End Class
Public Class GameSet
    Public Property ID() As Integer
    Public Property GameID() As Integer
    Public Property SetNo() As Integer
    Public Property ourScore() As Integer
    Public Property theirScore() As Integer

    Public Overridable Property Game() As Game
End Class
游戏集模型

Public Class Game
    Public Property ID() As Integer
    Public Property GameDateTime() As System.DateTime
    Public Property Opponent() As String
    Public Property HomeGame() As Boolean
    Public Property LeagueGame() As Boolean
    Public Property MVP_PersonID() As Nullable(Of Integer)
    Public Property VenueID() As Nullable(Of Integer)
    Public Property isNL() As Boolean

    Public Overridable Property Sets() As ICollection(Of GameSet)
    Public Overridable Property MVP() As Person
    Public Overridable Property TeamerMVP() As ICollection(Of TeamerMVP)
    Public Overridable Property Venue() As Venue
End Class
Public Class TeamerMVP
    Public Property GameID() As Integer
    Public Property PersonID() As Integer

    Public Overridable Property Person() As Person
End Class
Public Class Person
    Public Property ID() As Integer
    Public Property Name() As String
    Public Property isAdmin() As Boolean
    Public Property email() As String
    Public Property type() As String
    Public Property Image() As String
    Public Property thumbImage() As String
    Public Property backImage1() As String
    Public Property backImage2 As String
    Public Property Height() As String
    Public Property YearStarted() As String
    Public Property Position() As String
    Public Property PreviousClubs() As String
    Public Property ShirtNumber() As String
    Public Property isNL() As Boolean

    Public Overridable Property Games_MVP() As ICollection(Of Game)
    Public Overridable Property Games_TeamerMVP() As ICollection(Of Game)
End Class
Public Class GameSet
    Public Property ID() As Integer
    Public Property GameID() As Integer
    Public Property SetNo() As Integer
    Public Property ourScore() As Integer
    Public Property theirScore() As Integer

    Public Overridable Property Game() As Game
End Class
在控制台中的成功断点处使用
breezeConfig.manager.getEntities('TeamerMVP')
确实会显示整个“TeamerMVP”实体负载。“网络资源”选项卡还显示了原始返回数据中“TeamerMVP”的正确相关实体

但是,在控制台中的成功断点处运行
data.results[0].TeamerMVP()
,仍然不会返回任何结果:

data.results[0].TeamerMVP()
>[]
data.results[2].TeamerMVP()
>[]
上面的第一个是正确的,第一个返回的游戏还没有关联的“TeamerMVP”实体,但是序列中的第三个游戏确实有关联的实体,如返回的原始json数据所示:

TeamerMVP: [{$id:4, $type:lbD.model.TeamerMVP, lbD.model, GameID:24, PersonID:14,…},…]
 >0: {$id:4, $type:lbD.model.TeamerMVP, lbD.model, GameID:24, PersonID:14,…}
 >1: {$id:6, $type:lbD.model.TeamerMVP, lbD.model, GameID:24, PersonID:15,…}

最终更新

哇,我能说些什么呢?但我非常感谢IdeaBrade的Ward,感谢他花了这么多时间帮助解决这个问题。结果证明,这是最简单的事情:从依赖的“TeamerMVP”到父“Game”缺少返回导航属性

因此,我所要做的就是将TeamerMVP模型从:

Public Class TeamerMVP
    Public Property GameID() As Integer
    Public Property PersonID() As Integer

    Public Overridable Property Person() As Person
End Class
致:

…随着TeamerMVP实体出现在他们应该出现的地方,所有这些都立即变得栩栩如生


沃德和他在Ideablade的同事正在研究任何可能突出/陷害这种情况的可能性。如果你作为初学者阅读这个问题/试图了解更多关于Breeze的信息,那么我只能鼓励你全面试用它,因为它是一款令人惊叹的产品,我只是初步了解了它的功能。最重要的是,它背后有一支伟大的团队。谢谢沃德

显然不知道
Set
TeamerMVP
是实体类型。让我们确认一下:在第一个查询的成功回调上放置一个断点。然后在控制台中输入:
manager.metadataStore.\u structureTypemap
(假设
manager
是您的EM)。这将列出客户端上已知的类型。如果您看到
Set
TeamerMVP
,请告诉我们。如果你这样做。。。我很惊讶,但我们知道从哪里开始。如果您不这样做,我怀疑您对服务器上类型的定义有问题,尤其是EF映射。当您对我的问题有了答案时,我们将继续跟进。@Ward已编辑问题以添加详细信息。谢谢。@Ward再次编辑以添加更多信息。至少我们知道Breeze客户端可以识别这些类型。您不应该假设
游戏.set
不可见<代码>对象[0]是控制台中可观察数组的外观。展开它,您应该会看到该对象有一个
\uuuuko\uproto\uu
函数。但是如果
Game.
TeamerMVP`应该返回一个
TeamerMVP实体,那么就有问题了,因为它应该是一个依赖于
函数的可维护()。请参阅下一条评论。让我们关注
Game.TeamerMVP
。再次中断并告诉我们您在
manager.metadataStore.getEntityType('Game').navigationProperties中得到了什么。应该是一个由2个项目组成的数组,一个描述
Game.set
,一个描述
Game.TeamerMVP
。我打赌你只有一个导航属性。。。用于
游戏的一个。设置
。让我们知道,我们将采取下一步。