Serveur de clés générées par le serveur et de valeurs générées ne sont pas pris en charge par SQL Server Compact
J'ai juste commencé à jouer avec entity framework, j'ai donc décidé de le connecter à mon Serveur SQL existant CE base de données. J'ai une table avec une IDENTITÉ(1, 1) clé primaire, mais quand j'ai essayé d'ajouter une entité, j'ai l'erreur ci-dessus.
De MS l'article Technet j'ai appris que
SQL Server Compact ne prend pas en charge les entités avec générés par le serveur de clés ou de valeurs lorsqu'il est utilisé avec l'Entity Framework.
Lors de l'utilisation du Cadre de l'Entité, une entité clés peuvent être marqués comme étant générées par le serveur. Cela permet à la base de données pour générer une valeur pour la clé à l'insertion ou à la création d'entités. En outre, zéro, une ou plusieurs propriétés d'une entité peut être marqué en tant que serveur de valeurs générées. Pour plus d'informations, consultez la Boutique Motif Généré sujet dans le Cadre de l'Entité de la documentation.
SQL Server Compact ne prend pas en charge les entités avec générés par le serveur de clés ou de valeurs lorsqu'il est utilisé avec l'Entity Framework, bien que l'Entity Framework permet de définir les types d'entité avec générés par le serveur de clés ou de valeurs. La manipulation des données de fonctionnement sur une entité qui est générée par le serveur valeurs lance un "Non pris en charge" l'exception".
Alors maintenant, j'ai quelques questions:
- Pourquoi voudriez-vous la marque de clé généré par le serveur si il n'est pas pris en charge et lever une exception? Il est difficile de faire sence de la cité le paragraphe.
- Quand j'ai essayé d'ajouter StoreGeneratedPattern="Identité" à mon entité de la propriété, le Studio s'est plaint qu'il n'est pas permis. Ce que je fais mal?
- Quelle est la meilleure solution pour contourner cette limitation (y compris le passage à une autre base de données)? Mes limites sont à zéro,-l'installation et l'utilisation d'entity framework.
- NHibernate fonctionne très bien dans la même situation, btw.
- Il devrait être
StoreGeneratedPattern="None"
Vous devez vous connecter pour publier un commentaire.
Quand j'ai frappé cette limitation, j'ai changé le type uniqueidentifier
Utilisation de type uniqueidentifier ou de générer un bigint/int valeur de la clé manuellement est votre meilleure option.
Quelque chose comme ça peut-être ...
Cela suppose que vous n'avez pas de générer plus d'un enregistrement par les tiques au cours de l'exécution de l'application (plus le temps de s'arrêter et de redémarrer). C'est une hypothèse raisonnable, je crois, mais si vous voulez un totalement de preuve de balle (mais plus complexe) de la solution, allez lire les ID les plus élevés de la base de données et l'incrément de que.
SQL CE version 4.0 résolu ce problème avec son fournisseur Entity Framework.
The column 'DeviceId' has type 'SqlServerCe.uniqueidentifier', which is not a valid type for an identity column.
Server-generated keys are only supported for identity columns. The column 'ID' has type 'SqlServerCe.uniqueidentifier', which is not a valid type for an identity column.
Je viens de toucher cette question... mostlytech la réponse est probablement la meilleure option, les Guid sont très faciles à utiliser et le risque de clé de collision est très faible (mais pas inexistant).
Parce que SQL Server (non Compact) prend en charge, et d'autres tierces parties peuvent appuyer aussi... Entity Framework n'est pas seulement pour SQL Server Compact 😉
Dans mon cas, toutes mes classes ont la clé primaire nommée "ID"
J'ai créé une interface
Puis-je créer une méthode d'extension
Puis, quand j'ai besoin d'un nouvel ID, je viens de le faire:
GetNextID
avant d'enregistrer le dossier qu'ils auront tous la même Id.l'autre option est d'utiliser SqlCeResultSet sur les tables qui ont la colonne d'identité.
j'ai une clé primaire nommée ID avec des données de type INT32 et ont de la Colonne d'Identité
Viens de le faire
MyEntity Entité = new MyEntity();
Chaîne De Commande;
command = "Insert into Messages(Créé,le Message,MsgType)values('12/1/2014','Bonjour le Monde',5);
De l'entité.ExecuteStoreCommand(commande);
--Exclude la clé primaire dans l'Instruction insert
--Depuis le SQLCE ne prennent pas en charge le système de clés générées
- Ne pas utiliser LINQ, car il fournit une valeur par défaut à 0 pour les clés Primaires qui a un
type de données INT