2016-08-30 2 views
0

Ich habe eine ASP.NET Core 1.0-Webanwendung, die einige REST-Webdienste implementiert, die über Entity Framework Core mit einer PostgreSQL-Datenbank interagieren.Entity Framework Identität Spalte Negativer Wert

In meinem Modell habe ich eine Vielzahl von Code-first Entitätsklassen, das das folgende Muster verwenden:

[Key] 
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
public int Id { get; set; } 

Offensichtlich entspricht dies einen automatische Erhöhung eindeutigen Schlüssel Identitätsspalt in der Datenbank.

Das Problem ist, dass, zweifellos aufgrund eines Defekts irgendwo, gelegentlich aus Gründen, die ich noch nicht verstehe, der Wert der Id eine sehr große negative ganze Zahl ist.

-2147482645 

Normalerweise sie beginnen, gut erzogene schön aufsteigende Integer-Werte bei 1.

Was es verursachen könnte?

+0

Nichts hindert jemanden daran, eine solche Nummer manuell einzugeben –

+0

Mein __very__ begrenztes Verständnis von PostgreSQL ist, dass der Autoinkrement-Datentyp 'serial' oder' bigserial' heißt. Vielleicht sollten Sie überprüfen, was die Migration generiert. Wenn dies nicht gewünscht ist, verwenden Sie ein 'Column' -Attribut, um den bevorzugten Datentyp anzugeben. Übrigens sind die aktuellen Attribute, die Sie verwenden, überflüssig. Ihre Schlüsseleigenschaft folgt der Konvention. –

+0

@a_horse_with_no_name ja, aber das mache ich nicht. Ich lasse EF die volle Kontrolle über die Einsätze. – robbpriestley

Antwort

0

Es stellt sich heraus, dass dieses Problem damit zu tun hatte, Update() auf der Entität aufzurufen, bevor es sogar mit einem Aufruf von Add() eingefügt wurde. Wenn natürlich Update() für eine nicht eingefügte Entität aufgerufen wird, wird eine Ausnahme ausgelöst. Wenn Sie dann die Ausnahme abfangen und als Flag verwenden, dass die Entität hinzugefügt werden muss, scheint dies keine Option zu sein, da dies den konsistenten negativen ID-Wert bei der nachfolgenden Einfügung verursachte. Die Lösung beinhaltete die Erkennung mit anderen Mitteln, dass die Entität noch nicht vorhanden war, und rief dann ordnungsgemäß Add() an, um sie einzufügen, anstatt Update() als Standardaktion zu verwenden.

Verwandte Themen