Question

Ceci est un suivi à un question précédente j'ai posté sur les clés de l'entité EF4 avec SQL Compact . SQL Compact ne permet pas de clés d'identité générées par le serveur, donc je suis parti avec la création de mes propres clés comme des objets sont ajoutés à la ObjectContext. Mon premier choix serait une clé entière, et la réponse précédente liée à un billet de blog qui montre une méthode d'extension qui utilise l'opérateur Max avec une expression de sélection pour trouver la clé suivante disponible:

public static TResult NextId<TSource, TResult>(this ObjectSet<TSource> table,  Expression<Func<TSource, TResult>> selector) 
    where TSource : class
{
    TResult lastId = table.Any() ? table.Max(selector) : default(TResult);

    if (lastId is int)
    {
        lastId = (TResult)(object)(((int)(object)lastId) + 1);
    }

    return lastId;
}

Voici mon avis sur la méthode d'extension: Il fonctionnera bien si le ObjectContext que je travaille avec a un jeu d'entités non filtrée. Dans ce cas, le ObjectContext contiendra toutes les lignes de la table de données, et j'obtenir un résultat précis. Mais si l'ensemble de l'entité est le résultat d'un filtre de requête, la méthode retourne la dernière clé d'entité dans l'ensemble de l'entité filtrée, ce qui ne sera pas forcément la dernière touche dans le tableau de données. Je pense donc que la méthode d'extension ne fonctionne pas vraiment.

À ce stade, la solution évidente semble être d'utiliser simplement un GUID comme la clé de l'entité. De cette façon, je seulement besoin d'appeler la méthode de Guid.NewGuid() pour définir la propriété d'ID avant d'ajouter une nouvelle entité à mon ObjectContext.

Voici ma question: est-il un moyen simple d'obtenir la dernière clé primaire dans la banque de données de EF4 (sans avoir à créer une deuxième ObjectContext à cette fin)? Toute autre raison de ne pas prendre la voie facile et il suffit d'utiliser un GUID? Merci pour votre aide.

Était-ce utile?

La solution

J'ai fini par aller avec un GUID.

  • Les problèmes de taille / performance ne sont pas critique (ou même notable) avec SQL Compact, depuis il est un système local, un seul utilisateur. Il est pas comme l'application sera la gestion d'une réservation aérienne système.

  • Et au moins à ce stade, il semble pas autour de la « non clés générées par le serveur » limitation de la pile SQL Compact / EF4. Si quelqu'un a une bidouille, je suis toujours ouverts.

Cela ne signifie pas que je prendrais la même approche dans SQL Server ou SQL Express. J'ai encore une nette préférence pour les clés entiers, et grands frères de SQL Compact les laisse en conjonction avec EF4.

Autres conseils

Utilisez un Guid. AutoIncrement n'est pas pris en charge sur Compact Framework avec Entity Framework.

De plus, si jamais vous voulez créer une application qui utilise plusieurs sources de données, int PK vont se désagréger sur vous très rapidement.

  • Avec pour obtenir une nouvelle clé de Guid, vous pouvez appeler Juse Guid.NewGuid ().
  • Avec des années int, vous devez frapper la base de données pour obtenir une clé valide.

Si vous stockez des données dans plusieurs bases de données, int PK provoquera des conflits.

Qu'est-ce que je l'ai fait pour SQL CE avant, et je suppose que nous avons une seule application l'accès à la base de données, est de calculer la valeur MAX au démarrage et le mettre dans une variable statique. Vous pouvez maintenant distribuer des valeurs séquentielles facilement et vous pouvez faire le code pour les générer thread-safe très facilement.

L'une des raisons pour éviter Guids seraient taille = mémoire et la consommation d'espace de stockage.

Vous pouvez également interroger SQL métadonnées Compact comme ceci:

SELECT AUTOINC_NEXT DE INFORMATION_SCHEMA.COLUMNS OÙ 'Catégories' TABLE_NAME = ET AUTOINC_NEXT IS NOT NULL

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top