【发布时间】:2019-01-13 02:02:35
【问题描述】:
我已将实体的键设置如下
modelBuilder.Entity<SKU>().HasKey(p => new { p.DocEntry, p.Code });
modelBuilder.Entity<CUST>().HasKey(p => new { p.DocEntry, p.Code });
modelBuilder.Entity<Period>().HasKey(p => new { p.DocEntry, p.Code });
modelBuilder.Entity<FORECAST>().HasKey(p => new { p.DocEntry, p.Code });
FORECAST 实体具有前 3 个的导航属性。定义如下。
modelBuilder.Entity<FORECAST>()
.HasRequired<SKU>(d => d.FTTSku)
.WithMany()
.HasForeignKey(k => new { k.DocEntry, k.SkuLineNum });
modelBuilder.Entity<FORECAST>()
.HasRequired<CUST>(w => w.FTTCust)
.WithMany()
.HasForeignKey(k => new { k.DocEntry, k.CustLineNum });
modelBuilder.Entity<FORECAST>()
.HasRequired<Period>(w => w.Period)
.WithMany()
.HasForeignKey(k => new { k.DocEntry, k.PeriodID });
之后,当我尝试从表中读取数据时,EF 给我以下错误
(6,10) : 错误 3015: 从第 6 行开始映射片段时出现问题, 56:表 FORECAST 中的外键约束“FORECAST_Cust” (CustLineNum, DocEntry) 到表 CUST (DocEntry, Code):: 不足 映射:外键必须映射到某个 AssociationSet 或 参与外键关联的实体集 概念方面。
(31,10):错误 3015:从行开始映射片段时出现问题 31、56:表 FORECAST 中的外键约束“FORECAST_Period” (PeriodID, DocEntry) to table Period (DocEntry, Code):: Insufficient 映射:外键必须映射到某个 AssociationSet 或 参与外键关联的实体集 概念方面。
(41,10):错误 3015:从行开始映射片段时出现问题 41、56:表 FORECAST 中的外键约束“FORECAST_Sku” (FTTSkuLineNum, DocEntry) 到表 SKU (DocEntry, Code):: 不足 映射:外键必须映射到某个 AssociationSet 或 参与外键关联的实体集 概念方面。
当我更改外键定义的顺序时,此错误不存在。但它无法读取导航属性数据。我检查了分析器中生成的 SQL,发现连接条件也错误..
说,我改成
modelBuilder.Entity<FORECAST>()
.HasRequired<SKU>(d => d.FTTSku)
.WithMany()
.HasForeignKey(k => new { k.SkuLineNum, k.DocEntry });
生成的SQL如下,也是错误的。
INNER JOIN [dbo].[SKU] AS [Extent13] ON ([Extent10].[DocEntry] = [Extent13].[Code]) AND ( [Extent10].[SkuLineNum] = [Extent13].[DocEntry]) ) AS [Join7]
可能是什么原因?
【问题讨论】:
-
这确实很奇怪。您能否发布至少两个实体的相关部分,例如
FORECAST和SKU,以便重现该问题? -
是的,这很奇怪。我试图更新 .net 框架版本,但由于我的包中有一些错误,我恢复了我的解决方案并再次重新编写模型和关联。现在它似乎工作了。 :o
标签: c# sql-server entity-framework