Servergenerierte Schlüssel und servergenerierte Werte werden von SQL Server Compact nicht unterstützt

compact-framework entity-framework

Frage

Ich habe gerade angefangen, mit dem Entity-Framework zu spielen, und entschied mich daher, es mit meiner vorhandenen SQL Server CE-Datenbank zu verbinden. Ich habe eine Tabelle mit einem IDENTITY-Primärschlüssel (1, 1), aber als ich versuchte, eine Entität hinzuzufügen, habe ich den oben genannten Fehler.

Von MS Technet Artice habe ich das gelernt

SQL Server Compact unterstützt keine Entitäten mit vom Server generierten Schlüsseln oder Werten, wenn es mit Entity Framework verwendet wird. Bei der Verwendung von Entity Framework können die Schlüssel der Entität als vom Server generiert gekennzeichnet werden. Dadurch kann die Datenbank beim Einfügen oder beim Erstellen der Entität einen Wert für den Schlüssel generieren. Darüber hinaus können null oder mehr Eigenschaften einer Entität als vom Server generierte Werte markiert werden. Weitere Informationen finden Sie unter dem Thema "Store Generated Pattern" in der Entity Framework-Dokumentation. SQL Server Compact unterstützt keine Entitäten mit vom Server generierten Schlüsseln oder Werten, wenn es mit Entity Framework verwendet wird. Mit Entity Framework können Sie jedoch Entitätstypen mit vom Server generierten Schlüsseln oder Werten definieren. Datenbearbeitungsvorgang für eine Entität mit vom Server generierten Werten löst eine Ausnahme "Nicht unterstützt" aus.

Nun habe ich ein paar Fragen:

  • Warum sollten Sie den Schlüssel als servergeneriert markieren, wenn er nicht unterstützt wird und eine Ausnahme auslöst? Es ist schwer, den zitierten Absatz zu verstehen.
  • Wenn ich versucht habe, StoreGeneratedPattern = "Identity" zur Eigenschaft meiner Entität hinzuzufügen, beschwert sich Studio, dass dies nicht zulässig ist. Was mache ich falsch?
  • Was ist die beste Problemumgehung für diese Einschränkung (einschließlich des Wechsels zu einer anderen DB)? Meine Einschränkungen sind die Nullinstallation und das Entitäts-Framework.

Akzeptierte Antwort

Als ich diese Einschränkung traf, habe ich den Typ in uniqueidentifier geändert


Beliebte Antwort

Verwenden Sie uniqueidentifier oder generieren Sie manuell einen bigint / int-Schlüsselwert. Dies ist die beste Option.

So etwas vielleicht ...

    private static object lockObject = new object();

    private static long nextID = -1;

    public static long GetNextID()
    {
        lock (lockObject)
        {
            if (nextID == -1) nextID = DateTime.UtcNow.Ticks; else nextID++;
            return nextID;
        }
    }

Dies setzt voraus, dass Sie während eines Anwendungslaufs nicht mehr als einen Datensatz pro Tick generieren (plus die Zeit zum Anhalten und Neustarten). Dies ist eine vernünftige Annahme, glaube ich, aber wenn Sie eine absolut kugelsichere (aber komplexere) Lösung wünschen, lesen Sie die höchste ID aus der Datenbank und erhöhen Sie die Inkrementierung.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum