0

唔。对我来说似乎是错误的。我有一个轻而易举的查询可以做到这一点:

             var query = new breeze.EntityQuery()
                     .from("AllGames")
                     .expand("Sets, MVP, TeamerMVP.Person")
                     .orderBy("GameDateTime desc");

(每场比赛可能没有或有很多 TeamerMVP 记录,并且与 person 表存在一对一的关系,因此 TeamerMVP.Person 的扩展语句,因此我可以亲自直接访问“Name”属性。这在直接一对一相关的MVP(每场只能有一个))

一切似乎都很好 - 相关实体已加载,我也可以访问原型函数中的子实体。但是,我尝试在与子实体的 html 绑定中做很多事情时遇到问题,并且在检查 chrome 的控制台时,似乎可能是因为子实体与父实体不同,没有被声明为dependentobservable,它们只是普通的“对象” ”。

viewmodel defines parent as:           games = ko.observableArray([])

控制台评估:

$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]

在展开的节点中,您可以看到父实体级属性(GameDateTime、HomeGame 等)被创建为dependentobservables,但子实体(Sets、TeamerMVP)不是,我猜这就是为什么我有一些html 模板绑定中的麻烦,如“foreach”作为淘汰赛似乎根本看不到那些子实体。

有什么我想念的吗?我是否应该在视图模型中创建一个“games.Sets = ko.observableArray([])”声明以在创建子实体时充当子实体的容器?

返回的 json 数据显示如下:

TeamerMVP: [{$id:20, $type:lbD.model.TeamerMVP, lbD.model, GameID:3, PersonID:4,…}]
    0: {$id:20, $type:lbD.model.TeamerMVP, lbD.model, GameID:3, PersonID:4,…}
    $id: "20"
    $type: "lbD.model.TeamerMVP, lbD.model"
    GameID: 3
    Person: {$id:21, $type:lbD.model.Person, lbD.model, ID:4, Name:Mike Connor, isAdmin:false,…}
    PersonID: 4

并且很容易在相关的 Person 表中看到“Name”属性。

编辑补充:麻烦的只是“TeamerMVP”关系。只是设法在“Sets”实体上使用“forEach”做一些事情,这样就可以正常工作,即使它不是依赖可观察的......我很困惑。

进一步编辑了沃德的问题:

在断点按要求我看到这些列出:

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 Sets() As ICollection(Of GameSet)”)。

啊...刚刚扩展了“TeamerMVP”,它的默认资源名称是“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>

它嵌入在另一个模板(主要的“foreach:游戏”模板)中,这是它被引用的地方:

<span class="fixtureBoxLine" data-bind="template: { name: 'setScoresTemplate', foreach: Sets }"></span>
<span class="fixtureBoxLine" data-bind="template: { name: 'TeamerMVPTemplate', foreach: TeamerMVPs }"></span>

......它只是默默地打破。没有错误消息,但处理在第一个游戏的第一个循环时停止。其上方的“foreach: Sets”模板完美运行。

如果我在上面的绑定声明中将“foreach: TeamerMVPs”改回“foreach: TeamerMVP”,所有游戏都会被处理,但 TeamerMVP 的模板中没有显示任何内容,所以我猜“TeamerMVPs”是正确的实体引用,而且有些奇怪继续我尝试访问它的方式。“Person().Name”是模板中的正确绑定吗?

============================================

编辑4:模型说明

manager.metadataStore.getEntityType('Game').navigationProperties 返回 4 个导航属性。这是正确的,应该有一个 0 对多个“Sets”的集合,一个 0 对多个“TeamerMVP”的集合,一个 0 对一的“MVP”和一个 0 对一的“Venue”。所有人都在场。

可以只有一个(或没有)MVP,但从 0 到多个 TeamerMVP 是完全正确的。这种关系的建立方式与“Sets”关系的工作方式完全相同。唯一的细微差别是“TeamerMVP”tavle 本身与“Person”表具有 1 对 1 的关系,因为任何 TeamerMVP 都必须是有效的人。这就是为什么我的微风查询定义了一个引用“TeamerMVP.Person”的“扩展”,这似乎可以正常工作,因为返回的 json 数据完全符合我的预期。在原始 json 中,导航属性被称为“TeamerMVP”,只有在“structuraltypemap”中 defaultResourceName 被称为“TeamerMVPs”。

如果我将 html 绑定保留为“forEach TeamerMVP”,则所有游戏都会返回并按预期绑定到“foreach 游戏”父模板,但没有数据绑定到 TeamerMVP 模板,控制台中也不会显示错误。如果我将绑定更改为“foreach TeamerMVPs”,则只返回一场比赛,然后在发生绑定并显示数据时停止处理。但是,控制台中没有显示错误。

似乎微风在内部将导航属性创建为“TeamerMVPs”,但 json 正在返回“TeamerMVP”,也许这种差异是绑定似乎有效但没有绑定数据的原因?远远超出我目前的理解!

==================================================== ================

编辑5:添加模型信息

游戏模型

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

TeamerMVP 模型

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,…}
4

1 回答 1

1

最终更新

哇,我能说什么,但非常感谢 Ideablade 的 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

至:

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

    Public Overridable Property Game() As Game
    Public Overridable Property Person() As Person
End Class

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

沃德和他在 Ideablade 的同事正在研究是否有可能突出/捕获这种情况。如果您作为初学者阅读此问题/试图了解有关 Breeze 的更多信息,那么我只能鼓励您全面试用它,因为它是一款了不起的产品,而我只是触及了它可以做到的表面远的。最重要的是它背后有一个伟大的团队。谢谢沃德!

于 2013-02-25T08:47:58.653 回答