【发布时间】:2014-08-20 19:41:44
【问题描述】:
我有一个 EF 模型,它可以通过中间类进行自我引用来定义父/子关系。我知道如何使用Map 命令建立纯粹的多对多关系,但由于某种原因,通过这个中间类导致我的映射出现问题。中间类为关系提供了额外的属性。请参阅下面的类、modelBinder 逻辑和错误:
public class Equipment
{
[Key]
public int EquipmentId { get; set; }
public virtual List<ChildRecord> Parents { get; set; }
public virtual List<ChildRecord> Children { get; set; }
}
public class ChildRecord
{
[Key]
public int ChildId { get; set; }
[Required]
public int Quantity { get; set; }
[Required]
public Equipment Parent { get; set; }
[Required]
public Equipment Child { get; set; }
}
我已经尝试在两个方向上构建映射,但我一次只保留一个集合:
modelBuilder.Entity<ChildRecord>()
.HasRequired(x => x.Parent)
.WithMany(x => x.Children )
.WillCascadeOnDelete(false);
modelBuilder.Entity<ChildRecord>()
.HasRequired(x => x.Child)
.WithMany(x => x.Parents)
.WillCascadeOnDelete(false);
或
modelBuilder.Entity<Equipment>()
.HasMany(x => x.Parents)
.WithRequired(x => x.Child)
.WillCascadeOnDelete(false);
modelBuilder.Entity<Equipment>()
.HasMany(x => x.Children)
.WithRequired(x => x.Parent)
.WillCascadeOnDelete(false);
无论我使用哪个集合,当我尝试将我的 ef 模型部署到数据库时,我都会收到错误:The foreign key component 'Child' is not a declared property on type 'ChildRecord'. Verify that it has not been explicitly excluded from the model and that it is a valid primitive property.。
如果我在没有适当的 modelBinder 逻辑的情况下构建它,那么我会在 ChildRecord 表中获得 Child 的两个 ID 列和 Parent 的两个 ID 列。这是有道理的,因为它尝试从 Equipment 自动创建导航属性,并且不知道 ChildRecord 中已有属性可以满足此需求。
我尝试在类上使用数据注释,但没有模型构建器代码,失败并出现与上述相同的错误:
[Required]
[ForeignKey("EquipmentId")]
public Equipment Parent { get; set; }
[Required]
[ForeignKey("EquipmentId")]
public Equipment Child { get; set; }
与
[InverseProperty("Child")]
public virtual List<ChildRecord> Parents { get; set; }
[InverseProperty("Parent")]
public virtual List<ChildRecord> Children { get; set; }
我查看了互联网/SO 周围的各种其他答案,共同的区别似乎是我是自我加入的,因为我能找到的所有答案都是针对两种不同类型的。
【问题讨论】:
-
我尝试了第二个映射 (
modelBuilder.Entity<Equipment>()...)。没问题。 (EF 6.1.1,VS 2012)。 -
@GertArnold 从 EF 6.0.2 升级到 6.1.1 后,如您所建议的,使用第二组时错误消失了;但是输出 SQL 表仍然有四个 ID 列,两个用于子级,两个用于父级。看起来它没有正确地看到这种关系。
-
这很奇怪。我刚刚从头开始生成了一个数据库,而我的 ChildRecords 表只有两个外键。
-
@GertArnold 从头开始......当你记得重建时会有所帮助......现在它可以工作了。我确实认为这是 EF 版本#。如果您可以发布答案,我很乐意接受。
标签: c# entity-framework