Les clés et les valeurs générées par le serveur ne sont pas prises en charge par SQL Server Compact.

compact-framework entity-framework

Question

Je viens de commencer à jouer avec le framework d’entités, j’ai donc décidé de le connecter à ma base de données SQL Server CE existante. J'ai une table avec une clé primaire IDENTITY (1, 1) mais lorsque j'ai essayé d'ajouter une entité, j'ai l'erreur mentionnée ci-dessus.

De MS Technet artice j'ai appris que

SQL Server Compact ne prend pas en charge les entités avec des clés ou des valeurs générées par le serveur lorsqu'il est utilisé avec Entity Framework. Lorsque vous utilisez Entity Framework, les clés d'une entité peuvent être marquées comme générées par le serveur. Cela permet à la base de données de générer une valeur pour la clé lors de l’insertion ou de la création d’entités. En outre, zéro ou plusieurs propriétés d'une entité peuvent être marquées en tant que valeurs générées par le serveur. Pour plus d'informations, voir la rubrique Store Generated Pattern dans la documentation Entity Framework. SQL Server Compact ne prend pas en charge les entités avec des clés ou des valeurs générées par le serveur lorsqu'il est utilisé avec Entity Framework, bien que Entity Framework vous permette de définir des types d'entité avec des clés ou des valeurs générées par le serveur. Une opération de manipulation de données sur une entité qui a des valeurs générées par le serveur lève une exception "Non pris en charge".

Alors maintenant, j'ai quelques questions:

  • Pourquoi voudriez-vous marquer la clé comme générée par le serveur si elle n'est pas prise en charge et lèvera une exception? Il est difficile de déduire du paragraphe cité.
  • Lorsque j'ai essayé d'ajouter StoreGeneratedPattern = "Identity" à la propriété de mon entité, Studio s'est plaint de l'interdiction. Qu'est-ce que je fais mal?
  • Quelle est la meilleure solution de contournement pour cette limitation (y compris le passage à une autre base de données)? Mes limites sont l'installation zéro et l'utilisation d'un cadre d'entité.

Réponse acceptée

Quand j'ai atteint cette limite, j'ai changé le type en uniqueidentifier


Réponse populaire

Utiliser uniqueidentifier ou générer manuellement une valeur de clé bigint / int est votre meilleure option.

Quelque chose comme ça peut-être ...

    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;
        }
    }

Cela suppose que vous ne générez pas plus d'un enregistrement par coche lors de l'exécution d'une application (plus le temps nécessaire pour arrêter et redémarrer). Je crois que cette hypothèse est raisonnable, mais si vous souhaitez une solution totalement à l'épreuve des balles (mais plus complexe), lisez l'ID le plus élevé de la base de données et augmentez-le à partir de celui-ci.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow