如何在Entity Framework中设置两个相同类型的导航属性

使用代码第一个EF4(使用CTP5),我可以添加单个导航属性以及外键,它将遵循命名并且只将一次外键添加到表中。 如果我然后再添加相同类型的第二个属性,它会将其分解为表格中的4列而不是两列。

示例代码:

使用此模型,我获得了一个名为PressTypeID的PressType的AdapterFrameCapability表中的单个属性。

public class AdapterFrameCapability { [Key] public int AdapterFrameCapabilityID { get; set; } [Required] public int PressTypeID { get; set; } public virtual PressType PressType { get; set; } } 

这是我想要建模的设置,但它会导致在表中创建4列,分别用于FromPressTypeID,FromPressTypeFromPressTypeID,ToPressTypeID和ToPressTypePressTypeID。 理想情况下,我只是喜欢FromPressTypeID和ToPressTypeID的列。 我在这做错了什么?

 public class AdapterFrameCapability { [Key] public int AdapterFrameCapabilityID { get; set; } [Required] public int FromPressTypeID { get; set; } [Display(Name = "From Press Type")] public virtual PressType FromPressType { get; set; } [Required] public int ToPressTypeID { get; set; } [Display(Name = "To Press Type")] public virtual PressType ToPressType { get; set; } } 

这是您需要下拉流畅的API以获得所需架构的场景之一:

 protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .HasRequired(afc => afc.FromPressType) .WithMany() .HasForeignKey(afc => afc.FromPressTypeID) .WillCascadeOnDelete(true); modelBuilder.Entity() .HasRequired(afc => afc.ToPressType) .WithMany() .HasForeignKey(afc => afc.ToPressTypeID) .WillCascadeOnDelete(false); } 

在其中一个关联上切换级联删除是故意的, 否则 SQL Server会抛出以下错误:

在表’AdapterFrameCapabilities’上引入FOREIGN KEY约束’AdapterFrameCapability_ToPressType’可能会导致循环或多个级联路径。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束。

因此,我们需要在其中一个关联上关闭它,就像我在代码中所做的那样。

我以为你应该使用数据注释属性

 [ForeignKey("FromPressTypeId")] 

等等