web-dev-qa-db-ja.com

EFCore nullable関係設定onDelete:ReferentialAction.Restrict

私はefcore 2.0.1を実行しています。

私はモデルを持っています:

public class BigAwesomeDinosaurWithTeeth
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    public ICollection<YummyPunyPrey> YummyPunyPrey { get; set; }
}
public class YummyPunyPrey
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public Guid? BigAwesomeDinosaurWithTeethId { get; set; }

    [ForeignKey("BigAwesomeDinosaurWithTeethId")]
    public BigAwesomeDinosaurWithTeeth BigAwesomeDinosaurWithTeeth { get; set; }

}

私はこれら2つのクラスに流暢なAPIを持っていません。しかし、マイグレーションを生成すると

constraints: table =>
            {
                table.PrimaryKey("PK_YummyPunyPrey", x => x.Id);
                table.ForeignKey(
                    name: "FK_YummyPunyPrey_BigAwesomeDinosaurWithTeeth_BigAwesomeDinosaurWithTeethId",
                    column: x => x.BigAwesomeDinosaurWithTeethId,
                    principalTable: "BigAwesomeDinosaurWithTeeth",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Restrict);
            });

onDelete:ReferentialAction.Restrictが生成されるのはなぜですかClientSetNull

https://docs.Microsoft.com/en-us/ef/core/saving/cascade-delete

動作名|メモリ内の依存/子への影響|依存への影響/データベースの子

ClientSetNull(デフォルト)|外部キープロパティはnullに設定されます|なし

EF Core 2.0の変更点:以前のリリースでは、Restrictは追跡された依存エンティティのオプションの外部キープロパティをnullに設定し、オプションの関係のデフォルトの削除動作でした。 EF Core 2.0では、その動作を表すためにClientSetNullが導入され、オプションの関係のデフォルトになりました。制限の動作は、依存するエンティティに副作用がないように調整されました。

なぜこれが起こっているのかについての助けがあれば大歓迎です。

13
David Moores

EF Core 2.0.1メタデータと移行では、削除動作を指定するために異なる列挙型を使用します-それぞれ DeleteBehavior および ReferentialAction 。最初のものは十分に文書化されていますが、2番目と2つの間のマッピングは(執筆時点では)ありません。

これが現在のマッピングです:

_DeleteBehavior    ReferentialAction
==============    =================
Cascade           Cascade
ClientSetNull     Restrict
Restrict          Restrict
SetNull           SetNull
_

あなたの場合、関係は optional であるため、慣例的にDeleteBehaviorClientSetNullであり、_onDelete: Restrict_にマップされます。または言い換えると、enforced(有効)カスケード削除のないFK。

別の動作が必要な場合は、流れるようなAPIを使用する必要があります。

_modelBuilder.Entity<BigAwesomeDinosaurWithTeeth>()
    .HasMany(e => e.YummyPunyPrey)
    .WithOne(e => e.BigAwesomeDinosaurWithTeeth)
    .OnDelete(DeleteBehavior.SetNull); // or whatever you like
_
20
Ivan Stoev