Zum Inhalt springen

Kopieren von byte[] mit dem Entity Framework


Mttkrb

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...