嗯。在我看来是错的。我有一个简单的疑问,就是这样做的:
var query = new breeze.EntityQuery()
.from("AllGames")
.expand("Sets, MVP, TeamerMVP.Person")
.orderBy("GameDateTime desc");(每个游戏可以没有或多个TeamerMVP记录,并且与person表有一对一的关系,因此TeamerMVP.Person的展开语句使我可以亲自直接访问"Name“属性。这在直接一对一相关的MVP (其中每个游戏只能有一个)中工作得很好。
而且一切看起来都很好-相关实体被加载,我可以访问原型函数中的子实体,好的。但是,在html绑定与子实体的绑定中,我遇到了很多问题,而且,在签入chrome的控制台时,这可能是因为子实体与父实体不同,不被声明为可靠的可观察对象,它们只是普通的“对象”。
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等)。是作为依赖的可观察性创建的,但是子实体( see,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“的关系是麻烦的。只是设法在“集合”实体上使用"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 Set() as ICollection(Of GameSet)")。
啊..。刚刚扩展的"TeamerMVP“和它的默认资源名是”TeamerMVP“,这是一个很小但很微妙的区别!我不记得在任何地方都定义了一个带有"s“的版本,对项目的快速搜索不会发现任何结果。好奇心。也许这就是问题所在,我现在可以快速使用html绑定了。
编辑3: HTML绑定信息
不,一点都不打球.
我有一个模板:
<script type="text/html" id="TeamerMVPTemplate">
<div>Teamer MVP(s): </div>
<li data-bind="text: Person().Name"></li>
</script>它嵌入在另一个模板(主要的"foreach: games“)中,该模板是引用它的地方:
<span class="fixtureBoxLine" data-bind="template: { name: 'setScoresTemplate', foreach: Sets }"></span>
<span class="fixtureBoxLine" data-bind="template: { name: 'TeamerMVPTemplate', foreach: TeamerMVPs }"></span>...and它只是默默地打破了。没有错误消息,但是处理在第一个游戏的第一个循环上停止。"foreach: Sets“模板就在它上面,工作非常完美。
如果我将上面的绑定声明中的"foreach: TeamerMVP“改为"foreach: TeamerMVP”,那么所有游戏都会被处理,但是TeamerMVP的模板中没有显示任何内容,所以我想“TeamerMVP”是正确的实体引用,而且我试图访问它的方式有些奇怪。"Person().Name“是否是模板中的正确绑定?
===========================================
编辑4:模型的澄清
manager.metadataStore.getEntityType('Game').navigationProperties返回4个导航属性。这是正确的,应该有一个集合0到多个“集合”,一个集合对多个"TeamerMVP",一个0到一个"MVP“和一个0到一个”地点“。所有人都在场。
只能有一个(或没有) MVP,但是对于多个TeamerMVP来说0是完全正确的。这种关系的建立方式与工作的“集合”关系完全相同。唯一的细微差别是" TeamerMVP“tavle本身与" person”表有1到1的关系,因为任何TeamerMVP都必须是有效的人。这就是为什么我的轻松查询定义了一个引用"TeamerMVP.Person“的”展开“,这似乎是因为返回的json数据与我所期望的完全一样。在原始json中,导航属性被称为"TeamerMVP“,只有在"structuraltypemap”中,defaultResourceName才被称为“TeamerMVP”。
如果我将html绑定保留为"forEach TeamerMVP“,那么所有游戏都会按预期返回并绑定到"foreach TeamerMVP”父模板,但是没有数据绑定到TeamerMVP模板,控制台中也不会显示错误。如果我将绑定更改为"foreach TeamerMVP“,则只返回一个游戏,然后在绑定发生和数据显示时停止处理。但是,控制台中没有显示错误。
似乎微风在内部创建导航属性为"TeamerMVP“,而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 ClassTeamerMVP模型
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 ClassGameSet模型
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,…}发布于 2013-02-25 08:47:58
最终更新
哇,我还能说些什么呢?非常感谢Ideablade的沃德花了这么多时间来帮助解决这个问题。最后,它变成了最简单的东西:一个从依赖的"TeamerMVP“到父游戏的缺少的返回导航属性。
因此,我所要做的就是将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...and很快就出现了,TeamerMVP实体出现在他们应该出现的地方。
沃德和他在Ideablade的同事正在研究在可能的情况下强调/捕捉这种情况的可能性。如果你以初学者的身份阅读这个问题/试图了解更多关于Breeze的信息,那么我只能鼓励你充分尝试它,因为它是一个令人惊奇的产品,而且我只是触及到了它目前为止所能做的事情的表面。最重要的是,它背后有一支伟大的团队。谢谢沃德!
https://stackoverflow.com/questions/14592664
复制相似问题