0

基本クラスがあります。Entity_A と呼びましょう。これには、主キーであるプロパティ「ID」のみがあります。

public abstract class Entity_A
{
   [Key(), Required]
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   public Guid ID { get; set; }
}

次に、Entity_B と Entity_C という 2 つのクラスがあります。

Entity_B および Entity_C は Entity_A から継承されます。

シナリオ #1:

[Table("Entity_B")]
public class Entity_B : Entity_A
{
    [Required]
    public virtual string propertyB1 { get; set; }

    // Below foreign key
    [Required]
    [ForeignKey("propertyB2")]
    public virtual Guid propertyB2Id { get; set; }
    public virtual Entity_C propertyB2 { get; set; }
}

[Table("Entity_C")]
public class Entity_C : Entity_A
{
    [Required]
    public virtual string propertyC1 { get; set; }

    [Required]
    public virtual string propertyC2 { get; set; }
}

それは問題なく動作し、テーブルを作成します。私の問題は、Entity_A を削除し、各クラス Entity_B および Entity_C 内に「ID」プロパティを配置したときです。

シナリオ #2:

[Table("Entity_B")]
public class Entity_B
{
    [Key(), Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID { get; set; }

    [Required]
    public virtual string propertyB1 { get; set; }

    // Below foreign key
    [Required]
    [ForeignKey("propertyB2")]
    public virtual Guid propertyB2Id { get; set; }
    public virtual Entity_C propertyB2 { get; set; }
}

[Table("Entity_C")]
public class Entity_C
{
    [Key(), Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID { get; set; }

    [Required]
    public virtual string propertyC1 { get; set; }

    [Required]
    public virtual string propertyC2 { get; set; }
}

実行すると、例外が発生します。

Introducing FOREIGN KEY constraint 'Entity_B_propertyB2' on table 'Entity_B' may
cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO 
ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See 
previous errors.

OnModelCreating メソッドをオーバーライドして解決します。

// TURN OFF ON DELETE CASCADE GLOBALY BY REMOVING THE CONVENTION 
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();  
}

私の質問は次のとおりです。

1) Entity Framework の動作がシナリオ 1 (機能する場合) とシナリオ 2 (機能しない場合) で異なるのはなぜですか?

2) カスケード削除規則をオフにしないと、シナリオ #2 が機能しないのはなぜですか? オフにした場合、それは良い習慣ですか?悪いのか良いのか気になります。また、OnModelCreating をオーバーライドせずに動作させる方法はありますか?

どうもありがとう!

4

0 に答える 0