© deomis/Shutterstock.com
Kolumne: .NETversum

Kolumne: .NETversum


Setzen des Concurrency Mode für alle Spalten bei Code-based Modelling

Genau wie bei den EDMX-basierten Vorgehensweise „Database First“ und „Model First“ gilt auch beim „Code-based Modeling“ (alias „Code First“ oder „Code Only“), dass das Entity Framework in der Grundeinstellung bei schreibenden Datenzugriffen die Strategie „Der Letzte gewinnt“ nutzt. Das ist jedoch in der Praxis oft kein gangbarer und für die Nutzer auch kein akzeptabler Weg. Entwickler können aber bei Entity Framework das „optimistische Sperren“ (wie beim ADO.NET Dataset) aktivieren. Tipps und Tricks rund um .NET und Visual Studio

Beim Code-based Modeling erfolgt dies durch Annotation mit dem ConcurrencyCheckAttribute (siehe Plaetze und FreiePlaetze in Listing 1) – egal, ob die Entitätsklasse selbst geschrieben oder aus einer bestehenden Datenbank von Visual Studio per Reverse Engineering generiert wurde.

Listing 1

public partial class Flug { [Key] [Column(Order = 1)] public int FlugNr { get; set; } [Required] [StringLength(50), MinLength(3)] public string Abflugort { get; set; } [Required] [StringLength(50), MinLength(3)] public string Zielort { get; set; } [Required] [Column("FlugDatum", Order = 3)] public System.DateTime Datum { get; set; } [Required] [ConcurrencyCheckAttribute] [Range(100, 250)] [Index("NCL_PlaetzeFreiePlaetze", 1, IsUnique = false, IsClustered = false)] public short? Plaetze { get; set; } [ConcurrencyCheckAttribute] [Index("NCL_PlaetzeFreiePlaetze", 2, IsUnique = false, IsClustered = false)] public short? FreiePlaetze { get; set; } }

Dann entsteht im Fall einer Änderung an den freien Plätzen eines Flug-Objekts ein UPDATE-Befehl wie der folgende, in dem in der WHERE-Bedingung die Ursprungswerte aufgenommen sind:

exec sp_executesql N'UPDATE [dbo].[Flug] SET [FreiePlaetze] = @0 WHERE ((([FlugNr] = @1) AND ([Plaetze] = @2)) AND ([FreiePlaetze] = @3)) ',N'@0 smallint,@1 int,@2 smallint,@3 smallint',@0=22,@1=101,@2=250,@3=24

Das Gleiche passiert bei DELETE-Befehlen.

Allerdings ist es lästig, das ConcurrencyCheckAttribute explizit vor jede Property schreiben zu müssen – und wehe, man vergisst es an einer Stelle. Dann droht Dateninkonsistenz!

Zum Glück bietet Entity Framework im Bereich des Code-based Modeling einige Flexibilität, und so ist es bei diesem Vorgehensmodell möglich, eine elegantere Lösung zu schaffen, um das optimistische Sperren zu aktivieren: Man kann sich eine eigene Entity-Framework-Konvention schreiben, die den Standard umkehrt, also im Normalfall für a...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang