2009-05-18 5 views
1

Nous prévoyons d'utiliser des colonnes d'identité dans notre base de données de serveur sql. Actuellement, nous utilisons des guids pour générer des identifiants uniques, mais il s'avère que la commande est pertinente et nous envisageons de passer à des colonnes d'identité. Comme la commande est pertinente, nous voulons nous assurer que l'ordre dans lequel nous ajoutons des objets au contexte de l'entité est également l'ordre dans lequel ils sont insérés dans la base de données. Ceci est important car le serveur SQL générera des valeurs pour la colonne d'identité.La structure d'entité conserve-t-elle la commande lorsqu'elle est insérée dans la base de données?

Est-ce garanti par le framework d'entité? Si ce n'est pas le cas, qu'est-ce qu'une solution efficace pour générer vos propres identifiants entiers uniques pour une base de données mise à jour à partir de différents processus.

Répondre

1

Je ne fais que deviner ici (même si ça devrait être assez facile à tester), mais je ne pense pas qu'EF puisse garantir la commande. Je suis assez sûr que la structure interne est basée sur un type IEnumerable, probablement une liste, qui sont juste énumérées pendant l'insertion, et l'énumération est autant que je sache pas garanti pour être dans le même ordre chaque fois.

Je préfèrerais ajouter une colonne dédiée "ordre de tri" à votre table de base de données et la prendre forme là.

1

Je ne compte pas sur la commande d'insertion comme l'ordre de vos enregistrements retournés. Bien sûr, ça marchera la plupart du temps, mais que se passe-t-il si vous avez besoin d'insérer une ligne quelque part? Je dirais que votre meilleur pari est d'ajouter une colonne ordinale et de générer activement des ordinaux pour chaque ligne que vous souhaitez qu'ils soient retournés.

+0

Je prévois d'ajouter une colonne d'identité pour définir explicitement la commande. Cependant l'ordre que nous voulons y mettre est la séquence d'arrivée. Je suis à la recherche d'une solution qui évite d'interroger la base de données pour la dernière ligne ajoutée afin de dériver un nouvel identifiant pour la nouvelle ligne. –

+0

Eh bien, il y a certainement d'autres façons de le faire sans avoir à frapper la base de données. Par exemple, vous pourriez mettre un horodatage là-dedans. Si vous avez beaucoup de lignes en même temps, vous pouvez avoir un horodatage + index des transactions. Si vous ne voulez pas faire cela, vous pouvez avoir un bigint qui stocke les tiques. . . il est assez difficile d'obtenir plus d'un insert par tick. Fondamentalement, vous pouvez avoir un ordinal basé sur le temps si vous en avez besoin. Ensuite, si vous avez besoin de réorganiser pour une raison quelconque, vous avez toujours cette option. –

Questions connexes