微风:尽管定义了 invForeignKeyNames,但仍然没有填充复合外键的单向一对多导航

Posted

技术标签:

【中文标题】微风:尽管定义了 invForeignKeyNames,但仍然没有填充复合外键的单向一对多导航【英文标题】:breeze: unidirectional one-to-many navigation with compound foreign key still not populating in spite of invForeignKeyNames being defined 【发布时间】:2015-06-24 18:23:57 【问题描述】:

我目前使用的是 Breeze 1.5.3。

我已经为我的模型定义了元数据,以便两个实体 Column -> ColumnStatistic 之间存在单向的一对多关系。

当我检查服务返回的 JSON 时,我看到每个 Column 都有一个 ColumnStatistics 集合,但是当我检查结果实体时,这个集合是空的。

我正在使用 EF6 来提供主键和外键信息。我的 OnModelCreating 方法中的相关语句如下。

modelBuilder.Entity<Column>().HasKey(c => new  c.Owner, c.TableName,  c.ColumnName);
modelBuilder.Entity<ColumnStatistic>().HasKey(s=> new  s.Owner, s.TableName, s.ColumnName, s.StatisticName );
modelBuilder.Entity<Column>().HasMany(c => c.ColumnStatistics).WithRequired().HasForeignKey(s => new  s.Owner, s.TableName, s.ColumnName );

我为此示例创建了plunker。该示例比实际需要的要复杂一些,因为它包含本文范围之外的实体的元数据,但我清楚地看到了我的元数据中的Column_ColumnStatistics 关系以及相关的外键约束。

"association": [
        "name": "Column_ColumnStatistics",
        "end": [
            "role": "Column_ColumnStatistics_Source",
            "type": "Edm.Self.Column",
            "multiplicity": "1",
            "onDelete": "action": "Cascade"
        ,
        
            "role": "Column_ColumnStatistics_Target",
            "type": "Edm.Self.ColumnStatistic",
            "multiplicity": "*"
        ],
        "referentialConstraint": 
            "principal": 
                "role": "Column_ColumnStatistics_Source",
                "propertyRef": ["name": "Owner",
                                "name": "TableName",
                                "name": "ColumnName"]
            ,
            "dependent": 
                "role": "Column_ColumnStatistics_Target",
                "propertyRef": ["name": "Owner",
                                "name": "TableName",
                                "name": "ColumnName"]
            
        
    

所有外键字段都出现在我的服务返回的ColumnStatistic 实例中。该数据的一个典型示例如下。


"$id": "1",
"$type": "Archive.DtoModels.OracleMetadata.Column, Archive",
"Owner": "FUSION",
"TableName": "SGP_STUDENT",
"ColumnName": "CONSOLIDATED_SUBGROUP_CURR",
"DataType": "VARCHAR2",
"ColumnStatistics": [
    "$id": "2",
    "$type": "Archive.DtoModels.OracleMetadata.ColumnStatistic, Archive",
    "Owner": "FUSION",
    "TableName": "SGP_STUDENT",
    "ColumnName": "CONSOLIDATED_SUBGROUP_CURR",
    "StatisticName": "HasNull",
    "StatisticValue": 0,...]
  

另外,当我检查metadataStoreColumn 实体类型的ColumnStatistics 属性时,我看到invForeignKeyNames 被正确定义为我在元数据中指定的三值复合键。按照设计,inverse 是未定义的,因为我打算将其作为从 one 一侧到 many 一侧的单向导航属性。

根据我对 Breeze 发行说明的阅读,invForeignKeyNames 的定义应该足以保证 >= 1.3.5 版本中的 1 到 n 可导航性。由于在我的案例中定义了invForeignKeyNames,因此情况似乎与我设法在此站点上发现的最接近我的post 中概述的情况不同。尚未深入研究微风源代码,我想知道我的示例中的复合键是否是问题的一部分?

【问题讨论】:

【参考方案1】:

抱歉,breeze 不支持使用复合外键导航。

主键可以是复合键。导航属性可以链接到该复合键的属性之一。但是 FK 本身只能是一个属性。

显然,我们通过将foreignKeysinvForeignKeys 属性定义为数组来考虑这种可能性。但是我们推迟了实施(这增加了很多复杂性),直到我们看到大量需求。在跟踪这种可能性的 14 年中,您可能是第一个(至少在少数人中)遇到这种可能性的人。

您可以在我们的用户语音上发布对此功能的请求。但你现在需要另一种方法。

您的模型中有很多此类属性吗?它是只读的吗?如果它是相当孤立的,您可以通过在JsonResultsAdapter 中使用客户端操作将三部分密钥转换为单个部分密钥来解决它。如果这个想法很有吸引力,我们可以在后续跟进中一起解决。

【讨论】:

我的模型 非常简单且只读,我正在使用 DTO。因此,当我投影到我的对象并重新调整我的元数据以反映新的情况。尽管这听起来很诱人,但我认为在这种情况下我可以放弃客户端解决方案。感谢您的回复。

以上是关于微风:尽管定义了 invForeignKeyNames,但仍然没有填充复合外键的单向一对多导航的主要内容,如果未能解决你的问题,请参考以下文章

利用bordertransparent实现微风

角度 + 微风 + mongoLab

微风:保存时的多对多问题

调试微风js实体状态

可以用 MSSQL 进行微风续集吗?

当微风子实体更新父实体状态不改变时