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 :

Persistance d'ID après insert dans une base SQL (Dynamic Data pour web form) + EDMX


Sujet :

Entity Framework

  1. #1
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Points : 59
    Points
    59
    Par défaut Persistance d'ID après insert dans une base SQL (Dynamic Data pour web form) + EDMX
    Bonjour à tous ,
    Bon j'ai l'impression de tirer dans les coins vu que c'est le cas particulier d'un cas particulier mais j'ai l'impression d'être dans un mystère informatique

    J'ai un projet a base de site web, de fichier EDMX pour mapper une base SQL et de "DynamicData pour webform" pour accéder a la base.

    J'ai donc 2 parties a mon site, une partie pour les internautes et une partie qui me permet d'interagir avec la BDD (CRUD).

    Il m'arrive un truc étrange quant j’insère une nouvelle entré a ma base.

    L'ajout se fait de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public partial class Default : System.Web.UI.Page
        {
            public void addStudentForm_InsertItem()
            {
                var item = new LesQuestion();
     
                TryUpdateModel(item);
                if (ModelState.IsValid)
                {
                    using (DiagEntities db = new DiagEntities())
                    {
                        db.LesQuestions.Add(item);
                        db.SaveChanges();
                    }
                }
            }
    Initialement ça ne marchais pas (exeption). J'ai modifier sur ma base la propriété de la clé en mettant "StoreGeneratedPattern" à "Identity". ça ne fonctionnais toujours pas...
    Je suis aller sur mon fichier EDMX et visiblement ce genre de modification n'est pas prise en compte lors de la mise à jour du mappage et j'ai donc ajouter cette modif manuellement (donc j'ai mis la clé primaire a Identity (qui était initialement à false) dans mon fichier EDMX .
    Et la Tadaaa! ça marche, je peut inserer des lignes a ma table !!

    Je test donc des ajout/suppression de ligne pour voir un peu les bug de ma page insertion qui est ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    <%@ Page Title="BDDAccessInsertLesQuestions" Language="C#" MasterPageFile="~/BDDAccess.Master" AutoEventWireup="true" CodeBehind="BDDAInsertLesQuestions.aspx.cs" Inherits="DiaDocV1.Default" %>
     
     
    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolderBDDAccess" runat="server">
        <asp:ValidationSummary runat="server" ShowModelStateErrors="true" />
     
        <asp:FormView runat="server" ID="addStudentForm"
        ItemType="DiaDocV1.App_Data.LesQuestion" 
        InsertMethod="addStudentForm_InsertItem" DefaultMode="Insert"
        RenderOuterTable="false" OnItemInserted="addStudentForm_ItemInserted">
        <InsertItemTemplate>
            <fieldset>
                <ol>
                    <asp:DynamicEntity runat="server" Mode="Insert" />
                </ol>
                <asp:Button runat="server" Text="Insert" CommandName="Insert" />
                <asp:Button runat="server" Text="Cancel" CausesValidation="false" OnClick="cancelButton_Click" />
            </fieldset>
        </InsertItemTemplate>
    </asp:FormView>
     
    </asp:Content>
    Bon la c'est moins sympas... Sur une page web précédente (page modifier/supprimer dans la table) quant je clic sur modifier, l'ID (clé primaire) n'est pas modifiable ce qui est normal.
    En revanche sur ma page "insertion" je peut insérer quelques choses dans tous les champs y compris le champ ID!

    Du coup j'ai tester...
    Quant je ne rentre rien dans le champs ID , il me dit "rentre quelque chose" donc je suis obligé d'inscrire un ID. Quant je met un ID déjà utiliser je valide et la ligne est générer avec le 1er ID libre disponible (ex: j'ai 12 lignes, il va me créer une ligne ID=13). Cool! l'auto incrémentation fonctionne!

    Je vous expose à présent le soucis. Je me suis amusé a créer une ligne de n'importe quoi et à l'effacer ensuite. ça marche. J'en créer une nouvelle selon le même procéder qu'au dessus et alors mystérieusement il me créer un ID 14 alors que la ligne 13 n 'existe plus....???? je l'efface, je recommence l'insertion d'une ligne et je suis a présent à l'iD 15!! .

    J'ai vérifier sur ma base SQL, ces lignes n'existe pas, dans la table lié aucun création non plus de ces ID, bref j'ai regarder partout ces lignes n'ont pas été sauvegarder et pourtant ces ID utiliser/effacer semble considérer comme inutilisable a jamais

    Quelqu'un aurais une idée sur le moyen de réutiliser ces ID effacer ?

    merci de votre aide!

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Tu peux utiliser l'instruction suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    DBCC CHECKIDENT (<table>, RESEED, <valeur>)
    Cette commande devra être lancée à chaque commande DELETE. On ne peut donc que te recommander de ne pas le faire...

    Quel est le problème de ne pas avoir des ID qui se suivent ? Si c'est pour une problématique d'affichage, alors tu devrais avoir une autre colonne chargée de définir cela. Là, on parle de clé primaire donc c'est purement technique et ca ne devrait pas te gêner d'avoir des valeurs qui ne se suivent pas.

    A lire au passage : Auto incrément IDENTITY avec SQL Server
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Octobre 2015
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2015
    Messages : 98
    Points : 59
    Points
    59
    Par défaut
    Bonsoir et merci d'avoir pris le temps de me répondre.

    Effectivement cela ne me pose pas de problème, c'est une considération purement compréhensive:"Mais qui stock ce genre d'information et dans quel but ?!"
    Si fonctionnellement ensuite, pour la base, le fait qu'il y'est des sauts d'ID ne pose pas de soucis en terme de performance je vais laisser gonfler ce chiffre sans m'en préoccuper.

    Merci pour la lecture, qui plus est en français

    bonne année

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    C'est effectivement le comportement standard du compteur des clé primaires. Il s'indente à chaque ajout d'enregistrement et ne redescend jamais par lui même.

    Personnellement je te déconseille de t'amuser à bidouiller ces compteurs dans de l'opérationnelle. A la limite dans le cas ou une table serait vidée (transfert des données opérationnelles dans un système d'archivage), on pourrait imaginer remettre le compteur à zéro (particulièrement si on arrive dans le cas où la volumétrie est suffisamment important pour risquer de dépasser le maximum).

    Ou alors dans un environnement de développement ou tu bidouilles à gauche à droite, avoir des clés avec des petits chiffre rend parfois l'info plus lisible lors d'un débogage.

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

Discussions similaires

  1. insertion dans une base sql
    Par thered dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/11/2009, 06h33
  2. problème d'insertion dans une base SQL Server 2000 Via un trigger
    Par Alexandre_g dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/04/2009, 15h30
  3. probleme d'insertion dans une base sql server
    Par brajae85 dans le forum ASP.NET
    Réponses: 18
    Dernier message: 17/09/2008, 23h09
  4. Affichage d'une image après insertion dans une base
    Par leloup84 dans le forum Langage
    Réponses: 9
    Dernier message: 24/01/2006, 16h34
  5. Réponses: 10
    Dernier message: 24/02/2005, 14h57

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