none
IDENTITY_INSERT avec EF codefirst RRS feed

  • Question

  • J'utilise EF en codefirst sur une Bd SQL dans une app Windows en VB.

    J'ai une table dont la clé (ID) est un entier auto généré

    Lors de l’initialisation de la base j'ai besoin de créer  l'enregistrement avec lD=0, or la numérotation auto démarre à 1

    <DatabaseGenerated(DatabaseGeneratedOption.None)> ne me convient pas pour l'exploitation de cette table.

    je voudrais en faite temporairement modifier IDENTITY_INSERT.

    je sais mettre mes données en conformité en modifient la BDD à l’extérieur de mon application. Ce que je voudrais savoir c'est si vous connaissez le moyen  de le faire de façon élégante au niveau de l'application elle même; par exemple dans la méthode seed ou de faire commencer la numérotation à zéro. 

    en vous remerciant d'avance.


    BB

    mercredi 13 juin 2012 12:35

Réponses

Toutes les réponses

  • Bonjour,

    Vous pouvez changer le démarrage de l'incrémentation en spécifiant un IDENTITY(0,1).

    Si vous voulez forcer la valeur de votre identifiant à 0, il faudra exécuter les requêtes manuellement (via les classes SqlConnection et SqlCommande) et désactiver l'auto-incrémentation (avec SET IDENTITY_INSERT ON/OFF).

    Pourquoi avez vous besoin de créer une ligne avec un indentifiant égal à 0 ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0


    dimanche 17 juin 2012 09:50
    Modérateur
  • Bonjour,

    Vous pouvez changer le démarrage de l'incrémentation en spécifiant un IDENTITY(0,1).

    Quand vous parlez de IDENTITY(0,1) il s'agit d'une instruction SQL pas d'une annotation utilisable lors de la définition de la classe n'est-ce pas ?

    Si vous voulez forcer la valeur de votre identifiant à 0, il faudra exécuter les requêtes manuellement (via les classes SqlConnection et SqlCommande) et désactiver l'auto-incrémentation (avec SET IDENTITY_INSERT ON/OFF).

    Oui, ce que vous décrivez corresponds à ce que je fais actuelement


    Pourquoi avez vous besoin de créer une ligne avec un indentifiant égal à 0 ?

    Je n'ai pas vraiment besoin d'avoir un identifiant égale à zéro mais ça rends la structure sous-jacente plus claire et le code plus simple car les éléments liées qui ne visent pas un enregistrement de cette table font référence à une clé étrangère ID=0, et ça je 'ai pas la possibilité de le changer. En créant un  élément ID=0 "(aucun)" le processus ne soufre pas d'exception.

    Je vous remercie beaucoup pour votre aide.

    Cordialement,

    Bernard


    BB

    dimanche 17 juin 2012 10:48
  • Bonjour,

    "Je n'ai pas vraiment besoin d'avoir un identifiant égale à zéro mais ça rends la structure sous-jacente plus claire et le code plus simple car les éléments liées qui ne visent pas un enregistrement de cette table font référence à une clé étrangère ID=0".

    Vous maitrisez très mal les concepts de base de données...

    Si votre table qui contient la clé étrangère fait référence à une table avec une cardinalité 0,1 (attaché ou non à une ligne), cela se traduit au niveau modèle physique de données par une colonne de clé étrangère NULLable.

    Donc dans votre table qui contient la clé étrangère, rendez la colonne de clé nullable (NULL si aucune ligne est attaché, un identifiant de la table référencé dans le cas contraire).

    Cela évitera toute la gymnastique que vous souhaitez mettre en oeuvre...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    dimanche 17 juin 2012 11:04
    Modérateur
  •  Re bonjour donc,

    Oui, les BdD ne sont pas ma spécialité, vous avez raison. Néanmoins comme je l'ai indique dans mon message je n'ai pas la maitrise de la table qui contient la clé étrangère, je vais voir dans quelle mesure je peut faire modifier cela...

    Merci encore.

    Bernard


    BB

    dimanche 17 juin 2012 11:24
  • Voici la réponse à votre question: http://stackoverflow.com/questions/3332003/using-identity-insert-with-ef4

    My blog

    Whether you’re a construction worker, a forum moderator, or just someone that likes helping people. I think these guidelines can be helpful in keeping you helpful when being helpful.

    • Marqué comme réponse BerBuz mardi 24 juillet 2012 17:04
    mardi 24 juillet 2012 16:02
  • Merci beaucoup pour votre intérêt, J'ai utilisé une méthode similaire

    Cordialement,

    Bernard


    BB

    mardi 24 juillet 2012 17:06