私は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が導入され、オプションの関係のデフォルトになりました。制限の動作は、依存するエンティティに副作用がないように調整されました。
なぜこれが起こっているのかについての助けがあれば大歓迎です。
EF Core 2.0.1メタデータと移行では、削除動作を指定するために異なる列挙型を使用します-それぞれ DeleteBehavior
および ReferentialAction
。最初のものは十分に文書化されていますが、2番目と2つの間のマッピングは(執筆時点では)ありません。
これが現在のマッピングです:
_DeleteBehavior ReferentialAction
============== =================
Cascade Cascade
ClientSetNull Restrict
Restrict Restrict
SetNull SetNull
_
あなたの場合、関係は optional であるため、慣例的にDeleteBehavior
はClientSetNull
であり、_onDelete: Restrict
_にマップされます。または言い換えると、enforced(有効)カスケード削除のないFK。
別の動作が必要な場合は、流れるようなAPIを使用する必要があります。
_modelBuilder.Entity<BigAwesomeDinosaurWithTeeth>()
.HasMany(e => e.YummyPunyPrey)
.WithOne(e => e.BigAwesomeDinosaurWithTeeth)
.OnDelete(DeleteBehavior.SetNull); // or whatever you like
_