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

ASP.NET Discussion :

Gestion du "save" en db


Sujet :

ASP.NET

  1. #1
    Membre éclairé Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Par défaut Gestion du "save" en db
    Bonjour à tous,

    J'ai commencé depuis peu l'ASP .NET (+ c#). Je me suis basé sur un livre pour commencé. Le projet proposé dans ce livre est assez simple et j'ai réussi à l'implémenter sans trop de problème.

    J'aimerai maintenant gérer mes objets à ma sauce : Dans le projet du livre : à chaque ajout d'une instance dans le contexte, cette objet est sauvegardé en db :
    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
        public static class EntityObjectExtensions
        {
            public static void addToContext(this EntityObject aObject)
            {
                CTMSEntities.DataContext.AddObject(aObject.GetType().Name+"s", aObject);
                CTMSEntities.Save(); // ICI !
            }
     
            public static void removeFromContext(this EntityObject aObject)
            {
                CTMSEntities.DataContext.DeleteObject(aObject);
                CTMSEntities.Save(); // ICI !
            }
     
            public static void reloadFromDb(this EntityObject aObject)
            {
                CTMSEntities.DataContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, aObject);
            }
        }
    Vous remarquerez le "CTMSEntities.Save();" qui s'occupe de faire le flush dans la db.

    Pour éviter la sauvegarde automatique et laisser la possibilité à l'utilisateur de faire le save manuellement, j'ai retiré cette ligne :
    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 static class EntityObjectExtensions
        {
            public static void addToContext(this EntityObject aObject)
            {
                CTMSEntities.DataContext.AddObject(aObject.GetType().Name+"s", aObject);
            }
     
            public static void removeFromContext(this EntityObject aObject)
            {
                CTMSEntities.DataContext.DeleteObject(aObject);
            }
     
            public static void reloadFromDb(this EntityObject aObject)
            {
                CTMSEntities.DataContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, aObject);
            }
        }
    Pour vérifier si cela marche correctement, j'ai placé une grid dans mon projet Web.
    Lors de la création d'un objet, l'objet en question me semble ajouté au contexte, mais n'est pas affiché dans ma grid. Si je remet la ligne "CTMSEntities.Save();" l'objet apparait dans ma grid.

    J'aimerai donc savoir ce que je n'ai pas saisi afin de gérer moi même la sauvegarde en db via un boutton "Save" par exemple.

    Merci pour votre aide en espérant avoir été assez clair.

  2. #2
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Bonjour,

    Tu peux très bien faire la sauvegarde "manuellement". Si ta GridView n'affiche pas les objets ajoutés à ton contexte, c'est que sa source de données est basée sur la base de données, et non sur les objects en mémoire dans ton contexte.

    Peux-tu poster le code d'accès aux données que tu utilises pour ta grid ?

    En espérant t'avoir aidé.

  3. #3
    Membre éclairé Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Par défaut
    Salut,

    Merci pour ta réponse si rapide .

    Je me suis dit ca aussi, mais après vérification, il me semble que l'accès aux données est bon. Voici le code ASP de la grid qui affiche ma liste d'objets (nommés "CodeList") :
    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
     <dx:ASPxGridView ID="CodeListGrid" runat="server" ClientIDMode="AutoID" 
        DataSourceID="CodeListEDS" AutoGenerateColumns="False">
            <Columns>
                <dx:GridViewDataTextColumn FieldName="Label" ReadOnly="True" VisibleIndex="0">
                </dx:GridViewDataTextColumn>
                <dx:GridViewDataTextColumn FieldName="Description" VisibleIndex="1" 
                    ReadOnly="True">
                </dx:GridViewDataTextColumn>
            </Columns>
            <SettingsBehavior AllowFocusedRow="True" />
    </dx:ASPxGridView>
    <asp:EntityDataSource ID="CodeListEDS" runat="server" 
            ConnectionString="name=CTMSEntities" ContextTypeName="" 
            DefaultContainerName="CTMSEntities" EnableFlattening="False" 
            EntitySetName="Codelists" Select="it.[Label], it.[Description]">
    </asp:EntityDataSource>
    J'ai créé un Data source via l'interface de visual studio :
    ConnectionString : j'ai coché "NamedConnection" en le nommant "CTMSEntities".
    DefaultContainerName : J'ai mis "CTMSEntities".
    EntitySetName : Codelists (etant donné que mes objet sont nommé Codelist).
    Je n'ai pas coché les "Enable ...".

    J'espère que j'ai donné tout l'info nécessaire.

    ++ et merci

  4. #4
    Membre éclairé Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Par défaut
    Je ne comprend pas, je cherche toujours, mais j'ai l'impression que mon contexte change tous le temps.

    Voici mon code de gestion de contexte :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
        public partial class CTMSEntities : ObjectContext
        {
            private static Dictionary<string, CTMSEntities> DataContextList { get; set; }
     
            static CTMSEntities()
            {
                CTMSEntities.DataContextList = new Dictionary<string,CTMSEntities>();
            }
     
            private static CTMSEntities CreateDataContext()
            {
                return new CTMSEntities(ConfigurationManager.ConnectionStrings["CTMSEntities"].ConnectionString);
            }
     
            internal static CTMSEntities DataContext
            {
                get 
                {
                    CTMSEntities oDataContext = null;
                    string SessionID = HttpContext.Current.Session.SessionID;
                    // Web
                    if (HttpContext.Current != null && HttpContext.Current != null)
                    {
                        if (DataContextList.ContainsKey(SessionID))
                            oDataContext = DataContextList[SessionID];
                        else 
                        {
                            oDataContext = CTMSEntities.CreateDataContext();
                            DataContextList.Add(SessionID, oDataContext);
                        }
                    }
                    // Win
                    else
                    {
                        if (DataContextList.ContainsKey("AppliWin"))
                            oDataContext = DataContextList["AppliWin"];
                        else
                        {
                            oDataContext = CTMSEntities.CreateDataContext();
                            DataContextList.Add("AppliWin", oDataContext);
                        }
                    }
                    return oDataContext;
                }
            }
     
            public static void RemoveContext(string aDataContextId)
            {
                if (DataContextList.ContainsKey(aDataContextId))
                    DataContextList.Remove(aDataContextId);
            }
     
            private static void RemoveCurrentContext()
            {
                string SessionID = HttpContext.Current.Session.SessionID;
                CTMSEntities.RemoveContext(SessionID);
            }
     
            public static void Save()
            {
                CTMSEntities.DataContext.SaveChanges();
            }
     
            public static void Cancel()
            {
                CTMSEntities.RemoveCurrentContext();
                CTMSEntities.CreateDataContext();
            }
        }


    Nottez que pour l'instant, je n'ai pas encore de gestion de user. Le sissionId change donc d'un refresh à un autre. Temporairement, j'ai nom fixé ce string à "Test".
    Les idées sont les bienvenues

  5. #5
    Membre éclairé Avatar de Colbix
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 266
    Par défaut
    J'ai l'impression que ma grid n'affiche pas le contenu du context. Pourtant j'assigne le datasource de celle-ci à MonContext.Codelists :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    using System;
    using System.ComponentModel.DataAnnotations;
    using System.Web.DynamicData;
     
    namespace GridEntity
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                CodeListGrid.DataSource = CTMSEntities.DataContext.Codelists;
            }
     
            protected void NewCodeListBtn_Click(object sender, EventArgs e)
            {
                if (NewCodeListLabelTB.Text != "" && NewCodeListDescrTB.Text != "")
                {
                    Codelist oNewCodeList = new Codelist(NewCodeListLabelTB.Text, NewCodeListDescrTB.Text);
                    oNewCodeList.addToContext();
                }
                CodeListGrid.DataSource = CTMSEntities.DataContext.Codelists;
                CodeListGrid.DataBind();
            }
     
            protected void SaveBtn_Click(object sender, EventArgs e)
            {
                CTMSEntities.Save();
            }
     
            protected void CancelBtn_Click(object sender, EventArgs e)
            {
                CTMSEntities.Cancel();
            }
        }
    }
    CTMSEntities :
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    using System;
    using System.Data.Objects;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Web;
     
    namespace GridEntity
    {
        public partial class CTMSEntities : ObjectContext
        {
            private static Dictionary<string, CTMSEntities> DataContextList { get; set; }
     
            static CTMSEntities()
            {
                CTMSEntities.DataContextList = new Dictionary<string,CTMSEntities>();
            }
     
            private static CTMSEntities CreateDataContext()
            {
                return new CTMSEntities(ConfigurationManager.ConnectionStrings["CTMSEntities"].ConnectionString);
            }
     
            internal static CTMSEntities DataContext
            {
                get 
                {
                    CTMSEntities oDataContext = null;
                    string SessionID = "Test"; //HttpContext.Current.Session.SessionID;
                    // Web
                    if (HttpContext.Current != null && HttpContext.Current != null)
                    {
                        if (DataContextList.ContainsKey(SessionID))
                            oDataContext = DataContextList[SessionID];
                        else 
                        {
                            oDataContext = CTMSEntities.CreateDataContext();
                            DataContextList.Add(SessionID, oDataContext);
                        }
                    }
                    // Win
                    else
                    {
                        if (DataContextList.ContainsKey("AppliWin"))
                            oDataContext = DataContextList["AppliWin"];
                        else
                        {
                            oDataContext = CTMSEntities.CreateDataContext();
                            DataContextList.Add("AppliWin", oDataContext);
                        }
                    }
                    return oDataContext;
                }
            }
     
            public static void RemoveContext(string aDataContextId)
            {
                if (DataContextList.ContainsKey(aDataContextId))
                    DataContextList.Remove(aDataContextId);
            }
     
            private static void RemoveCurrentContext()
            {
                string SessionID = "Test"; //HttpContext.Current.Session.SessionID;
                CTMSEntities.RemoveContext(SessionID);
            }
     
            public static void Save()
            {
                CTMSEntities.DataContext.SaveChanges(true);
            }
     
            public static void Cancel()
            {
                CTMSEntities.DataContext.DetectChanges();
                CTMSEntities.RemoveCurrentContext();
                CTMSEntities.CreateDataContext();
            }
        }
    }
    EntitiesObjectExtensions :
    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
    using System;
    using System.Data.Objects.DataClasses;
     
    namespace GridEntity
    {
        public static class EntityObjectExtensions
        {
            public static void addToContext(this EntityObject aObject)
            {
                CTMSEntities.DataContext.AddObject(aObject.GetType().Name + "s", aObject);
            }
     
            public static void removeFromContext(this EntityObject aObject)
            {
                CTMSEntities.DataContext.DeleteObject(aObject);
            }
     
            public static void reloadFromDb(this EntityObject aObject)
            {
                CTMSEntities.DataContext.Refresh(System.Data.Objects.RefreshMode.StoreWins, aObject);
            }
        }
    }

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