Ich habe eine Reihe von Integrationstests, die direkt auf die Datenbank zugreifen - Testvoraussetzungsobjekte erstellen - die Tests durchführen und anschließend aufräumen - aber ich wollte den gleichen Ansatz im Speicher ausprobieren.
Ich habe gerade Mühe in meinem Projekt verwendet und es funktioniert sehr einfach. Ich habe jedoch ein Problem, das ich versucht habe - aber nicht lösen können.
Eine der Tabellen, die ich mit Dummy-Daten füllen muss - als Testvoraussetzung - enthält eine berechnete Spalte (nvarchar, nicht null). Für den Umfang des Tests interessiert mich der Wert dieser Spalte nicht wirklich - aber selbst wenn ich Dummy-Daten einfüge, werden meine Daten ignoriert und dann wird ein Fehler ausgegeben:
"Column 'x' cannot be null. Error code: GenericError"
In meinen Tests verwende ich die gleiche edmx-Datei, wie sie vom eigentlichen Code verwendet wird. Das hindert mich daran, die edmx-Kopie ständig zu aktualisieren.
Gibt es einen Weg, auf dem ich den Test erzwingen kann, das edmx (zur Laufzeit) zu aktualisieren, so dass die Spalte eine nullbare nicht berechnete Spalte ist? [overriding OnModelCreating] oder gibt es eine Möglichkeit, einen Standardwert einzufügen (alles für diese Spalte), um diesen Fehler zu stoppen? [überschreibt SaveChanges]
Ich habe derzeit folgendes versucht:
Bearbeiten:
Ich habe versucht, die OnModelCreating- Methode zu überschreiben, aber ohne Erfolg, da dies DB-First ist.
modelBuilder.Entity<Entity_Name>().Property(p => p.x).IsOptional().HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
Der Grund für das Problem war ein Fehler in der Effort-Datenbank. Wenn die berechnete Spalte auf nicht nullwertfähigen Spalten basiert, kann die berechnete Spalte auch automatisch nicht nullwertfähig werden. Daher erwartete die Effort-Datenbank einen Wert ungleich Null. Mit dem neuesten Update ist das Problem behoben. Sie müssen das globale EntityFrameworkEffortManager.UseDefaultForNotNullable
Flag auf true setzen.
Siehe die Ausgabe auf Github