13

使用代码优先 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; }
}
4

2 回答 2

15

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

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<AdapterFrameCapability>()
                .HasRequired(afc => afc.FromPressType)
                .WithMany()
                .HasForeignKey(afc => afc.FromPressTypeID)
                .WillCascadeOnDelete(true);

    modelBuilder.Entity<AdapterFrameCapability>()
                .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 约束。无法创建约束。

所以我们需要像我在代码中那样关闭其中一个关联。

于 2010-12-14T04:19:11.310 回答
0

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

public class AdapterFrameCapability
{
    [Key]
    public int AdapterFrameCapabilityID { get; set; }

    [Required]
    public int FromPressTypeID { get; set; }

    [Display(Name = "From Press Type")]
    [ForeignKey(nameof(FromPressTypeId))]
    public virtual PressType FromPressType { get; set; }

    [Required]
    public int ToPressTypeID { get; set; }

    [Display(Name = "To Press Type")]
    [ForeignKey(nameof(ToPressTypeID))]
    public virtual PressType ToPressType { get; set; }
}
于 2010-12-16T23:21:14.183 回答