Ich benutze EF Core (in ASP.NET Core und meine DbContext
Leben pro Anfrage/Bereich).Ändern der eingeschränkten Spalte in EF Core mit einer Transaktion
Meine Employee
Einheit hat diese Eigenschaft:
public bool? IsBoss { get; set; }
und diese config:
entityBuilder.Property(b => b.IsBoss).IsRequired(false);
entityBuilder.HasIndex(b => b.IsBoss).IsUnique();
Dies erzeugt einen gefilterten Index, so kann es nur eine wahre, eine falsche, aber viele Nullen sein.
Meine App erfordert, dass ich immer genau einen Mitarbeiter mit IsBoss==true
habe.
Angenommen, ich möchte zwei Mitarbeiter tauschen.
employee1.IsBoss = null;
employee2.IsBoss = true;
context.SaveChanges();
Dies löst eine Ausnahme für eine Ausnahme für bedingte Verletzung aus.
Ich kann das Problem beheben, indem sie in einer Transaktion Verpackung:
using (var transaction = context.BeginTransaction())
{
try
{
employee1.IsBoss = null;
context.SaveChanges();
employee2.IsBoss = true;
context.SaveChanges();
transaction.Commit();
}
catch
{
transaction.Rollback();
}
}
Meine Frage ist: Warum scheitern wird der erste Ansatz? Ich dachte EF Core automatically wraps alles in einer Transaktion. Warum muss ich eine Transaktion verwenden?
Danke für die detaillierte Antwort ... Ich habe nicht erwartet, dass es ein Fehler ist! Willst du sagen, dass die nächste Version mir erlauben wird, dies zu tun 1) mit nur einem 'SaveChanges()' und 2) ohne eine Transaktion? – grokky
Antwort ist ja für beide Fragen :) Sie werden nur einen 'SaveChanges' brauchen und standardmäßig wird es in die Transaktion eingebunden. – Smit