Using db As New Entities
Dim errE As New errorlog
errE.benutzer = usrBenutzer.Login
errE.domain = usrBenutzer.Domain
errE.computer = usrBenutzer.Computer
errE.datum = Now
errE.fehlertext = err.Message
errE.quelle = err.Source
errE.stacktrace= err.StackTrace
db.AddToerrorlog(errE)
db.SaveChanges()
End Using
; Public Function Clone(Of t As EntityObject)(entity As t, ctx As oraEntities, Optional copyKeys As Boolean = True) As t Try Dim cloneE As t = ctx.CreateObject(Of t)() Dim pis As PropertyInfo() = entity.GetType.GetProperties() For Each pi As PropertyInfo In pis Dim attrs As EdmScalarPropertyAttribute() = DirectCast(pi.GetCustomAttributes(GetType(EdmScalarPropertyAttribute), False), EdmScalarPropertyAttribute()) For Each attr As EdmScalarPropertyAttribute In attrs If Not copyKeys AndAlso attr.EntityKeyProperty Then Continue For End If 'Strung und NULL abfangen, wird trotz Standardwert im SQL Server nicht imgesetzt Dim objVal As Object If pi.PropertyType = GetType(String) And pi.GetValue(entity, Nothing) Is Nothing Then objVal = "" Else objVal = pi.GetValue(entity, Nothing) End If pi.SetValue(cloneE, objVal, Nothing) Next Next Return cloneE Catch ex As Exception Throw ex End Try End Function und zu vergleichen; Public Function Compare(Of t As EntityObject)(entityOriginal As t, entityCopy As t) As Boolean Try 'Um Änderungen einer Entität festzustellen (t.equals funktioniert aufgrund der Abhängigkeiten mit anderen Tabellen nicht) Dim pisOrig As PropertyInfo() = entityOriginal.GetType.GetProperties() For Each piOrig As PropertyInfo In pisOrig Dim attrs As EdmScalarPropertyAttribute() = DirectCast(piOrig.GetCustomAttributes(GetType(EdmScalarPropertyAttribute), False), EdmScalarPropertyAttribute()) If attrs.Count > 0 Then 'Fremdschlüsseltabellen ausschliessen Dim objOrig As Object = If(GetType(t).GetProperty(piOrig.Name).GetValue(entityOriginal, Nothing) Is Nothing, "", GetType(t).GetProperty(piOrig.Name).GetValue(entityOriginal, Nothing)) Dim objCopy As Object = If(GetType(t).GetProperty(piOrig.Name).GetValue(entityCopy, Nothing) Is Nothing, "", GetType(t).GetProperty(piOrig.Name).GetValue(entityCopy, Nothing)) If Not objOrig.Equals(objCopy) Then Return False End If End If Next Return True Catch ex As Exception Throw ex End Try End Function Verknüfte Tabellen werden dabei allerdings nicht übernommen!
oder auf Englisch: New transaction is not allowed because there are other threads running in the session. Szenario: In einer Schleife werden Objekte einer Tabelle verarbeitet und nach erfolreicher verarbeitung als "verarbeitet" markiert. Dabei schlägt der context.savechanges des Enityty Frameworks fehl. der Grund ist sowohl simple als auch, zumindest für mich, anfänglich nicht ganz verständlich, da ich eben an dieser Stelle speichern möchte. Die verwendete EF Connection behält die Änderungen des Objects bei und setzt diese auf "modified", so dass ein einmaliges savechanges genügt um alle Objekte zu speichern. Das Kuriose ist, dass es EF das nicht einmal zulässt, selbst wenn man die schlechtere Performance in Kauf nehmen wollte. Schuld ist die Schleife, die Objekte zur Laufzeit aus dem Context liest und so eine Änderung nicht zulässt...
Using db as new EF_Context Dim jobs = From w In db.jobs Where Not w.verarbeitet.HasValue For Each job In jobs 'Verarbeitung If verarbeite_job(job) = true then 'abhaken job.verarbeitet = now 'db.savechanges 'SCHLÄGT FEHL!!! else 'loggen endif Next db.SaveChanges 'HIER ISSES RICHTIG End Using