Mttkrb Geschrieben 1. Juli 2015 Teilen Geschrieben 1. Juli 2015 Hallo, ich habe eine Anwendung, die mittels EntityFramework eine SQL-Datenbank anspricht. Im Context gibt es eine Entität, die byte[] speichert. Ab und zu kommt es vor, dass Einträge dupliziert werden sollen, was sich als relativ langsam herausstellt. Folgender Code wird dazu beispielhaft ausgeführt: public void CopyToNewPerson(CustomContext ctx, int oldPersonId, int newPersonId) { foreach(var image in ctx.Set<Image>().Where(w=>w.PersonId=oldPersonId)) { ctx.Set<Image>().Add(new Image{ PersonId=newPersonId, Name=image.Name, Bytes=image.Bytes }); } ctx.saveChanges(); } Die Größe eines byte[] beträgt etwas zwischen 1-3MB. Werden nun viele oder auch größere Einträge kopiert, so verlängert sich die Ausführungszeit, sodass der Vorgang insgesamt länger als erhofft dauert. Gibt es eine Möglichkeit dies etwas eleganter zu lösen? Die erste Alternative, die mir einfällt wäre in dem Context ein SQL-Command abzusetzen. ctx.Database.ExecuteSqlCommand("insert into...where...",oldPersonId,newPersonId) Für jeden Vorschlag bin ich dankbar. Gruß Jogibaer0411 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
arlegermi Geschrieben 1. Juli 2015 Teilen Geschrieben 1. Juli 2015 Wieso kopiert ihr die Bytes rum? Wäre eine Zwischentabelle à la "Person2Image" nicht einfacher? Da muss man sich natürlich Gedanken machen, was bei einem Update passieren soll, aber wenigstens spart man sich die ganzen doppelten Bilder in der Datenbank. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mttkrb Geschrieben 1. Juli 2015 Autor Teilen Geschrieben 1. Juli 2015 Das wäre natürlich wünschenswert. Die Bilder sollen aber wirklich doppelt vorhanden sein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
arlegermi Geschrieben 1. Juli 2015 Teilen Geschrieben 1. Juli 2015 Wenn das jetzt zu weit führt, ignorier die Frage einfach, aber: Aus welchem Grund wollt ihr Daten doppelt in der Datenbank haben? Zum eigentlichen Problem: Von wievielen Bildern pro Person reden wir und was heißt "länger als erhofft" in Bezug auf die benötigte Zeit? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mttkrb Geschrieben 1. Juli 2015 Autor Teilen Geschrieben 1. Juli 2015 Das die doppelt dort angelegt werden, resultiert aus einem spezialfall. Normalerweise werden die einträge nicht dupliziert. Zurück zum eigentlichen Problem: bei knapp 30 Bildern mit der besagten Größe dauert die Ausführung zwischen 20 und 30 Sekunden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
arlegermi Geschrieben 1. Juli 2015 Teilen Geschrieben 1. Juli 2015 Also max. 100MB in ~30 Sekunden? Läuft die Kommunikation zwischen Datenbank und Anwendung über's Netzwerk? Dann hast du immerhin schonmal ~200MB Traffic. Je nachdem, was das für eine Verbindung ist, kann das schon einen Teil ausmachen (bei einer 100MBit-Leitung immerhin ~16 Sekunden; bei GBit ist es hingegen nahezu irrelevant). Es gibt für den DbContext noch einen Schalter, der u.U. was bringen könnte (kann ich mir aber egtl nicht vorstellen, dass das in den Größenordnungen spielt): context.Configuration.AutoDetectChangesEnabled = false; Standardmäßig ruft der DbContext bei jedem Add einmal DetectChanges auf, was immer ein wenig Zeit kostet. Das ist zumindest das, was ich bei mir immer als erstes teste, ob ich damit Performance rausholen kann. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mttkrb Geschrieben 3. Juli 2015 Autor Teilen Geschrieben 3. Juli 2015 Hallo, das AutodetectChangesEnabled habe ich ausrobiert, es gab allerdings keine nennenswerte Besserung. Ich hab mich jetzt damit beholfen, dass ich mittels sqlcommand ein insert-select abgesetzt. Das ist jetzt nicht die schönste Lösung, mir reicht es aber so erst einmal. Vielen dank für die Tipps. Sollte das kopieren jetzt doch vermehrt benutzt werden, werde ich die DB-Struktur doch lieber auf ein n:m mapping ändern. Gruß Jogibaer0411 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.