Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Kopieren von byte[] mit dem Entity Framework

Empfohlene Antworten

Veröffentlicht

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

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?

  • Autor

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.

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.

  • Autor

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.