私はEFコアを使用しています(ASP.NETコア内で、要求/スコープごとにDbContext
が存在します)。トランザクションを使用してEFコアの一意の制約付き列を変更する
私Employee
実体は、このプロパティを持っています
public bool? IsBoss { get; set; }
と、この設定:
entityBuilder.Property(b => b.IsBoss).IsRequired(false);
entityBuilder.HasIndex(b => b.IsBoss).IsUnique();
これを濾過したインデックスを作成し、その唯一の真の、1偽の、しかし、多くのNULLがあることができます。
私のアプリでは、常に1人の従業員がIsBoss==true
であることが必要です。
2人の従業員を交換したいとします。
employee1.IsBoss = null;
employee2.IsBoss = true;
context.SaveChanges();
これは、一意制約違反例外をスローします。
私はトランザクションでそれをラップすることにより、これを修正することができます
using (var transaction = context.BeginTransaction())
{
try
{
employee1.IsBoss = null;
context.SaveChanges();
employee2.IsBoss = true;
context.SaveChanges();
transaction.Commit();
}
catch
{
transaction.Rollback();
}
}
私の質問は:なぜ最初のアプローチは失敗するのか?私はEF Core automatically wrapsをトランザクション内のすべてと考えました。なぜ私はトランザクションを使用する必要がありますか?
詳細な回答ありがとうございました...私はそれがバグであるとは思わなかった!あなたは、次のリリースでは、1つの 'SaveChanges()'と1つのトランザクションだけを使ってこの1)と2)を行うことができると言っていますか? – grokky
答えはどちらの質問でもyesです:あなたは 'SaveChanges'を1つだけ必要とし、デフォルトではトランザクションでラップされます。 – Smit