13

Entity Framework コード ファースト アプローチの使用。

2 つのエンティティ クラスがあるとします。

[Table("Objects")]
public class DbObject : IValidatableObject
{
    public long Id { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<DbObjectProperty> Properties { get; set; }
}

[Table("ObjectProperties")]
public class DbObjectProperty
{
    public long Id { get; set; }

    public string Name { get; set; }
    public string Value { get; set; }

    [Display(Name = "Object"), UIHint("Object")]
    public long ObjectId { get; set; }
    public virtual DbObject Object { get; set; }
}

ここでの注意点:

  • DbObjectナビゲーション プロパティのみがあり、外部キーを持つ列はありません
  • DbObjectPropertyナビゲーション プロパティ、外部キーを持つ対応する列があります
  • オブジェクトを削除する場合、そのプロパティも一緒に移動したいのは明らかですが、1 つのプロパティを削除した場合、オブジェクト全体が消えてしまうのは望ましくありません。

DB コンテキストのOnModelCreatingメソッドでは、これまで次の関係を定義していました。

modelBuilder.Entity<DbObjectProperty>()
    .HasRequired(op => op.Object)
    .WithMany(obj => obj.Properties)
    .HasForeignKey(op => op.ObjectId)
    .WillCascadeOnDelete(false);

もちろん、これはカスケード削除が発生しないことを意味します。私の質問は、これを に変更した場合true、それは私が望むことですか? オブジェクトを削除する場合は、そのプロパティも一緒に移動したいのですが、1 つのプロパティを削除した場合にオブジェクト全体が消えてしまうのは望ましくありません。

この変更 ( からfalsetrue) に対して自動生成された移行コードは次のとおりです。

DropForeignKey("ObjectProperties", "ObjectId", "Objects");
DropIndex("ObjectProperties", new[] { "ObjectId" });
AddForeignKey("ObjectProperties", "ObjectId", "Objects", "Id", cascadeDelete: true);
CreateIndex("ObjectProperties", "ObjectId");

プロパティを削除すると、関連付けられたオブジェクトが削除されることを暗示しているように見えるのではないかと心配しています。しますか?

4

1 に答える 1

14

データベース内のリレーションシップのカスケード削除の方向は、このリレーションシップのプリンシパル (プライマリ/一意キーのテーブル) と従属 (外部キーのテーブル) は何かによって定義されます。

次に、プリンシパルを削除すると、そのプリンシパルのプライマリ/一意キー値に対応する外部キー値を持つすべての従属も削除されます。従属からプリンシパルへのカスケード削除はありません。

あなたの場合、プリンシパルは外部キーを持つエンティティ/テーブルであるためDbObject、依存関係があります。DbObjectProperty

逆にカスケード削除を行うことはほとんど意味がありません-特に x 対多の関係ではDbObjectProperty:DbObject削除しようとしているプリンシパルを参照するその他の依存関係です。

心配する必要はありません。

于 2012-04-12T12:59:15.790 に答える