IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entity Framework Discussion :

Valeur explicite pour colonne auto-incrémentée


Sujet :

Entity Framework

  1. #1
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut Valeur explicite pour colonne auto-incrémentée
    Bonjour à tous,

    Connaissez-vous le moyen de spécifier explicitement une valeur pour une colonne de type identité ?

    Je me trouve dans la situation suivante : je dois importer des données existantes dans une base et je passe par un modèle EF. Dans le cas de ma table des Pays, je dois conserver les IDs existant car ils sont utilisés via une clé étrangère de la table des adresses.

    Cependant, dans la nouvelle table, la colonne ID est une colonne Identity.

    Dans le programme d'import, j'ai beau préciser la valeur de la colonne Id, EF n'en tient pas compte et lui attribue la valeur automatique...

    Existe-t-il un moyen qu'il prenne compte ma valeur, ou est-ce que je dois retirer l'attribut "Identity" le temps de l'import des données ?

    Merci

    Edit :

    J'ai essayé de créer manuellement l'EntityKey, mais la valeur n'est quand même pas prise en compte au moment du SaveChanges.
    Si ton problème a une solution, rien ne sert de t'inquiéter..
    Si il n'en a pas, t'inquiéter ne sert à rien


  2. #2
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    Bon, après de multiples recherches, j'en suis au point suivant :

    Il n'est apparemment pas possible de modifier ce comportement.

    Cependant, j'ai trouvé une solution pour contourner le problème.

    La commande suivante positionne le compteur d'identity sur la valeur que l'on veut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBCC CHECKIDENT('TableName', RESEED, valeur);
    EDIT : Attention, après test, cette solution n'est pas idéale car le comportement de CheckIdent varie selon que la table a déjà contenu des données ou pas

    Je vais donc abuser de cette commande pour importer mes données avec les bonnes clés..

    Néanmoins, je suis toujours preneur si quelqu'un trouve "mieux"
    Si ton problème a une solution, rien ne sert de t'inquiéter..
    Si il n'en a pas, t'inquiéter ne sert à rien


  3. #3
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 60
    Points : 88
    Points
    88
    Par défaut
    Le plus propre, c'est de :
    - désactiver temporairement "IDENTITY"
    - importer les données
    - corriger les clés primaires pour se conformer au mécanisme d'attribution automatique d'IDENTITY (en changeant la valeur des clés etrangères de concert).
    - réactiver les contraintes

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Citation Envoyé par Pongten Voir le message
    Je me trouve dans la situation suivante : je dois importer des données existantes dans une base et je passe par un modèle EF.s.
    J'aurais tendance à dire que déjà ça commence bizarrement : importer des données est typiquement une tâche pour l'ETL et j'ai un peu (beaucoup) de mal à imaginer la valeur ajoutée d'un ORM pour faire cela.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Bonjour

    J'aurais tendance à dire que déjà ça commence bizarrement : importer des données est typiquement une tâche pour l'ETL et j'ai un peu (beaucoup) de mal à imaginer la valeur ajoutée d'un ORM pour faire cela.
    En fait dans ce cas, il s'agit d'une refonte d'une application existante (refonte est même est un faible mot) tout en souhaitant garder les données existantes.

    La couche d'accès aux données existantes est fonctionnelle, et pour la nouvelle application, l'ORM entre en jeux.

    Le choix d'utiliser l'ORM pour la migration des données existantes est uniquement lié à un gain de temps.

    Sinon, il me semble évident que pour un projet de plus grande ampleur, c'est évidemment là solution à envisager.

    Citation Envoyé par frecil Voir le message
    Le plus propre, c'est de :
    - désactiver temporairement "IDENTITY"
    - importer les données
    - corriger les clés primaires pour se conformer au mécanisme d'attribution automatique d'IDENTITY (en changeant la valeur des clés etrangères de concert).
    - réactiver les contraintes
    Le problème est que le modèle a été généré sur base d'une BD où les colonnes IDENTITY étaient spécifiées, les contraintes du modèles sont alors appliquées.

    Pour utiliser cette solution, cela nécessiterait de parcourir les tables pour retirer la colonne IDENTITY, régénérer un modèle, effectuer la migration, parcourir les tables pour réactiver les colonnes IDENTITY, régénérer un modèle pour l'utilisation de l'application...

    Car de ce que j'ai lu, il n'existe pas de commande T-SQL pour désactiver une colonne de type Identity. La façon de procéder revient à créer un colonne de même type, la remplir avec les valeurs de la colonne Identity, et dropper cette dernière.. Puis faire l'inverse pour réactiver l'Identity.
    Si ton problème a une solution, rien ne sert de t'inquiéter..
    Si il n'en a pas, t'inquiéter ne sert à rien


  6. #6
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Août 2004
    Messages : 60
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par Pongten Voir le message
    En fait dans ce cas, il s'agit d'une refonte d'une application existante (refonte est même est un faible mot) tout en souhaitant garder les données existantes.

    La couche d'accès aux données existantes est fonctionnelle, et pour la nouvelle application, l'ORM entre en jeux.
    Je pense que c'est effectivement une bonne idée pour un nouveau projet de partir sur un ORM comme EntityFramework plutôt qu'une couche d'accès aux données fait-maison. Ton code sera plus maintenable ainsi.

    Citation Envoyé par Pongten Voir le message
    Le choix d'utiliser l'ORM pour la migration des données existantes est uniquement lié à un gain de temps.
    Est-ce vraiment le cas ?
    N'oublie pas que la migration est quelque chose de très particulier, que tu n'auras à faire qu'une seule fois à priori donc tu n'as pas besoin que le code de migration soit maintenable => l'ORM ne s'impose pas ici.

    Citation Envoyé par Pongten Voir le message
    Sinon, il me semble évident que pour un projet de plus grande ampleur, c'est évidemment là solution à envisager.
    Je n'ai jamais utilisé d'ETL, mais effectivement je doute que l'on en ait besoin , une simple solution à base de requête SQL ad-hoc voir un peu de code C# devrait suffire.

    Citation Envoyé par Pongten Voir le message
    Pour utiliser cette solution, cela nécessiterait de parcourir les tables pour retirer la colonne IDENTITY, régénérer un modèle, effectuer la migration, parcourir les tables pour réactiver les colonnes IDENTITY, régénérer un modèle pour l'utilisation de l'application...
    Tu vois tu te compliques vraiment la vie en voulant tout faire passer par l'ORM (régénérer un modèle temporaire juste pour la migration ).

    Citation Envoyé par Pongten Voir le message
    . La façon de procéder revient à créer un colonne de même type, la remplir avec les valeurs de la colonne Identity, et dropper cette dernière.. Puis faire l'inverse pour réactiver l'Identity.
    Oui, c'est bien celà comme solution tu garde l'ancienne clé primaire dans une colonne dédié, la nouvelle en auto-incrément, puis tu as un peu de travail pour mettre à jour toutes les clé étrangères pour pointer sur la nouvelle clé primaire, et puis hop "drop" de l'ancienne.

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par frecil Voir le message
    Je n'ai jamais utilisé d'ETL, mais effectivement je doute que l'on en ait besoin , une simple solution à base de requête SQL ad-hoc voir un peu de code C# devrait suffire.
    L'ETL ça sert justement à gagner du temps et à eviter l'écriture de scripts de migration susceptibles d'être complexes.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  8. #8
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    L'ETL ça sert justement à gagner du temps et à eviter l'écriture de scripts de migration susceptibles d'être complexes.
    Oui, mais nécessite de trouver une solution ETL, puis de s'y former, avant de pouvoir commencer à mettre en place la solution et là, même si c'est intéressant je suis vraiment trop court en temps


    Pour ce qui est du reste, j'ai effectivement abandonné l'utilisation de l'ORM dans ce cas (malgré le workaround qui ne s'avère pas fiable en fait).

    Je vais procéder comme frecil le suggère à un moment, à savoir que je vais moi même coder une programme console pour procéder à l'import des données.
    Si ton problème a une solution, rien ne sert de t'inquiéter..
    Si il n'en a pas, t'inquiéter ne sert à rien


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pb pour l'auto-incrémentation
    Par matinho dans le forum C#
    Réponses: 23
    Dernier message: 13/11/2007, 19h57
  2. [Oracle 10 g] Colonne auto-incrémentée
    Par Thomad dans le forum Oracle
    Réponses: 11
    Dernier message: 14/09/2007, 13h11
  3. Réponses: 1
    Dernier message: 23/07/2007, 20h57
  4. [SQL] Récupérer simplement la valeur de l'id "auto incrémenté"
    Par yazerty dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/10/2006, 12h16
  5. Connaître la valeur d'un champ auto incrémenté
    Par soltani1 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 18/05/2006, 14h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo