微风:尽管定义了 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,...]
另外,当我检查metadataStore
中Column
实体类型的ColumnStatistics
属性时,我看到invForeignKeyNames
被正确定义为我在元数据中指定的三值复合键。按照设计,inverse
是未定义的,因为我打算将其作为从 one 一侧到 many 一侧的单向导航属性。
根据我对 Breeze 发行说明的阅读,invForeignKeyNames
的定义应该足以保证 >= 1.3.5 版本中的 1 到 n 可导航性。由于在我的案例中定义了invForeignKeyNames
,因此情况似乎与我设法在此站点上发现的最接近我的post 中概述的情况不同。尚未深入研究微风源代码,我想知道我的示例中的复合键是否是问题的一部分?
【问题讨论】:
【参考方案1】:抱歉,breeze 不支持使用复合外键导航。
主键可以是复合键。导航属性可以链接到该复合键的属性之一。但是 FK 本身只能是一个属性。
显然,我们通过将foreignKeys
和invForeignKeys
属性定义为数组来考虑这种可能性。但是我们推迟了实施(这增加了很多复杂性),直到我们看到大量需求。在跟踪这种可能性的 14 年中,您可能是第一个(至少在少数人中)遇到这种可能性的人。
您可以在我们的用户语音上发布对此功能的请求。但你现在需要另一种方法。
您的模型中有很多此类属性吗?它是只读的吗?如果它是相当孤立的,您可以通过在JsonResultsAdapter
中使用客户端操作将三部分密钥转换为单个部分密钥来解决它。如果这个想法很有吸引力,我们可以在后续跟进中一起解决。
【讨论】:
我的模型 非常简单且只读,我正在使用 DTO。因此,当我投影到我的对象并重新调整我的元数据以反映新的情况。尽管这听起来很诱人,但我认为在这种情况下我可以放弃客户端解决方案。感谢您的回复。以上是关于微风:尽管定义了 invForeignKeyNames,但仍然没有填充复合外键的单向一对多导航的主要内容,如果未能解决你的问题,请参考以下文章