Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gibt es eine Möglichkeit, CreateIfNotExists in Entity Framework zu beschleunigen?

Ja. Der Punkt ist, die echte Datenbank nur für Integrationstests zu verwenden, die nicht so oft ausgeführt werden müssen, und der gesamte Satz von Integrationstests wird normalerweise nur auf dem Build-Server ausgeführt.

Dies liegt an langsame Initialisierung von EF beim Komponententest (Sie können versuchen, zu x86 zu wechseln). Die Zeit wird auch durch die Generierung von Ansichten verbraucht. Ansichten können vorgeneriert werden Dies wird normalerweise getan, um den Start und die Initialisierung des realen Systems zu reduzieren, aber im Falle der Beschleunigung von Unit-Tests mit der Verwendung von View Pre-Generation hilft es nicht allzu viel, da Sie nur die Zeit vom Test zum Build verschieben.

Herumgehen würde nur bedeuten, ein einfaches altes SQL-Skript zu verwenden. Die zusätzliche Zeit, die für diese Operation benötigt wird, kann für die Generierung dieser SQL aufgewendet werden. Ich denke, das SQL wird nicht zwischengespeichert, da die normale Anwendungsausführung es normalerweise nicht mehr als einmal benötigt, aber Sie können EF bitten, Ihnen zumindest den wichtigsten Teil dieses SQL zu geben, es irgendwo zwischenzuspeichern und es jedes Mal selbst auszuführen, wenn Sie es brauchen . EF kann Ihnen SQL für Tabellen und Einschränkungen geben:

var dbSql = ((IObjectContextAdapter) context).ObjectContext.CreateDatabaseScript();

Sie müssen nur Ihr eigenes kleines SQL haben, um eine Datenbank zu erstellen und sie zusammen zu verwenden. Sogar so etwas wie das folgende Skript sollte ausreichen:

CREATE DATABASE YourDatabaseName

USE YourDatabaseName

Sie müssen auch zuerst die Datenbankgenerierung im Code deaktivieren, damit dies funktioniert und Sie die Kontrolle über den Prozess übernehmen können:

Database.SetInitializer<YourContextType>(null);

Beim Ausführen von SQL zur Datenbankerstellung benötigen Sie eine separate Verbindungszeichenfolge, die auf Master zeigt Datenbank.