Linq-To-SQL generisches hinzufügen/bearbeiten/löschen von Daten

Endlich schaffe ich es mal wieder zubloggen.

Ich möchte euch zeigen, wie ich seit kurzen meine Daten mit der Datenbank über Linq-To-SQL abgleiche. Dabei gehe ich nur auf das hinzufügen von neuen Daten/Objekten, welche mit der Methode “InsertOnSubmit()” durch geführt wird.

Die Idee kam, da ich in meinem Code/Repository immer wieder DataContext.Users.InsertOnSummit(newUser) verwende. Jedoch muss/sollte man immer mit einem try-catch-Block die SQLException abfangen, dieser Code fand sich dann an vielen Stellen in meinem Repository. Dann habe ich gefunden, dass man sich die Tabelle aus dem DataContext auch über GetTable(object.GetType()) holen kann und dort dann ein InsertOnSubmit(object) nutzen kann.

//_DC = DataContext
//_Log = Log4Net
//ErrorMail ist eine Methode von mir, die mir bei Exceptions das per Mail mitteilt.

internal Boolean AddEntity(object e)
{
 Boolean back = false;
 if (e != null)
  {
   _DC.GetTable(e.GetType()).InsertOnSubmit(e);
   try
   {
    _DC.SubmitChanges();
    back = true;
   }
   catch (SqlException ex)
  {
    _DC.GetTable(e.GetType()).DeleteOnSubmit(e);
    ErrorMail(ex);
   _Log.Warn("AddEntity-Exception");
   _Log.Debug(ex.Message);
  }
 }
 return back;
}

Diese Methode nutze ich nun in allen Repository-Klasse, wo ein Insert/Add erfolgt “AddEntity(newUser)” und da muss ich mich nun nur noch in der einen Methode um das Fehlerfangen, Loggen und ErrorMails kümmern.

Unbedingt sollte man “_DC.GetTable(e.GetType()).DeleteOnSubmit(e);” im catch-Block ausführen! Denn wenn der Submit fehlt schlägt, befindet sich das Objekt noch in der “Warteschlage” zum ausführen, deswegen wird es mit “DeleteOnSubmit(object)” wieder aus der “Warteschlage” genommen und somit nicht zu weiteren Fehlern führt.

Wenn man diese Methode für das Update verwendet, dann sollte man drauf achten, das man einen Refrech der alten Daten durchführt, damit man keine inkonsistenz Daten hat.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


5 − 2 =

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>