2017-12-11 6 views
0

Ich verwende eine im Speicher EF Core-Datenbank wie folgt aus:Wie wird automatisch eine Spalte mit einem Entity Framework-Kern in der Speicherdatenbank inkrementiert?

  var options = new DbContextOptionsBuilder<DmpContext>() 
      .UseInMemoryDatabase("test") 
      .Options; 

     var context = new CustomContext(options); 

Ich füge einige zufällige Daten Bogus verwenden.

  var resources = new Faker<Resource>() 
      .RuleFor(x => x.Name, x => x.Name.FullName()) 
      .Generate(20); 

In dieser Ressourcensammlung sind alle IDs immer noch Null.

Wenn ich die AddRange ausführen ich die IDs erzeugt erwarten werden:

   context.Resources.AddRange(resources); 
       context.SaveChangesAsync(); 

Aber sie nicht erzeugt werden.

System.AggregateException: Ein oder mehrere Fehler sind aufgetreten. (Die Instanz des Entitätstyps 'Ressource' kann nicht verfolgt werden, da bereits eine andere Instanz mit demselben Schlüsselwert für {'ResourceId'} verfolgt wird. Beim Anhängen vorhandener Entitäten sicherstellen, dass nur eine Entitätsinstanz mit einem angegebenen Schlüsselwert angefügt ist.

Also dachte ich, dann lassen sie mich ihnen nur gesetzt und ein Autoinkrement Mechanismus selbst machen. Das hat funktioniert.

Doch als ich dann meine Add Methoden (diese Methoden einfügen Datensätze) versuchen und zu testen. ich bin Ich kann nicht die IDs in diesen Methoden festlegen, da die ID nicht einmal in der Schnittstelle ist. Wieder würde ich erwarten, dass EF die ID automatisch generiert, aber ID 1 (das ist bereits vergeben, weil ich bereits die ID 1 erzeugt habe) bis 20).

Kann jemand einen EF Kern in der Gedächtnisdatenbank erklären, um immer seine Schlüssel automatisch zu erhöhen?

+1

EF Kern tut Autoinkrement Tasten, die sind eingerichtet, dies unabhängig von der Verwendung im Speicher oder in der normalen Datenbank zu tun. Ziehen Sie in Erwägung, eine vollständige Repro-Datei zu erstellen (a.k.a 'mcve'), da das Problem nicht mit den aktuell bereitgestellten Informationen reproduziert werden kann - nach Aufruf von' AddRange' werden die 'Id's automatisch erzeugt. –

Antwort

0

Sie sollten das Identity-Feld im Entity Framework Designer oder im Code als Identity markieren. EF verwaltet alle Mechanismen zur Identitätsgenerierung selbst.

prüfen this resource

Dies ist, wie Sie es im Editor eingestellt (drücken f4 oder rechten Maustaste> Eigenschaften auf dem Identitätsfeld):

enter image description here

+2

Ich glaube nicht, dass du meine Frage verstanden hast. Es handelt sich um eine in der Speicherdatenbank, die den EF-Kern verwendet, und es ist auch nicht hilfreich, das vom Geschäft generierte Muster auf "Identität" für eine in der Speicherdatenbank zu setzen. –

+0

@NickN. Oh, das tut mir leid. Können Sie das Objektmodell hinzufügen, das Sie der Frage hinzufügen möchten (Faker und Ressource)? –

+0

Der Faker ist nur ein Helfer, der eine IEnumerable von Ressourcen zurückgibt. Eine Ressource ist nur eine Id (int) und ein Name (String) –

Verwandte Themen