13

コード最初の EF4 (CTP5 を使用) を使用すると、外部キーと共に単一のナビゲーション プロパティを追加できます。これにより、名前付けが尊重され、外部キーがテーブルに 1 回だけ追加されます。次に、同じタイプの 2 つ目のプロパティを追加すると、テーブルの 2 列ではなく 4 列に分割されます。

サンプルコード:

このモデルでは、PressTypeID という名前の PressType の AdapterFrameCapability テーブルに 1 つのプロパティが追加されます。

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

これは、目的のスキーマを取得するために流暢な APIをドロップダウンする必要があるシナリオの 1 つです。

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);
}

アソシエーションの 1 つでカスケード削除をオフにするのは意図的なものです。そうしないと、 SQL Server が次のエラーをスローするためです。

テーブル 'AdapterFrameCapabilities' に FOREIGN KEY 制約 'AdapterFrameCapability_ToPressType' を導入すると、サイクルまたは複数のカスケード パスが発生する可能性があります。ON DELETE NO ACTION または ON UPDATE NO ACTION を指定するか、他の FOREIGN KEY 制約を変更します。制約を作成できませんでした。

そのため、コードで行ったように、関連付けの 1 つでスイッチをオフにする必要があります。

于 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 に答える