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 :

date par défaut dans le modèle


Sujet :

Entity Framework

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut date par défaut dans le modèle
    Bonjour,

    Comme le titre l'indique, j'ai un modèle où un champs est createDate est j'aimerai qu'il soit la date à laquelle a lieu l'insert.

    voici ma classe:
    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
    public class User:Person
        {
            [MaxLength(50, ErrorMessage = "Le login ne peux excéder 50 caractères")]
            [Required(ErrorMessage = "Le login est requis")]
            [Display(Name="Login")]
            public string login { get; set; }
            [Display(Name = "Mot de passe")]
            [MinLength(6, ErrorMessage = "Le mot de passe doit contenir au moins 6 caractère.")]
            public string password { get; set; }
            [Display(Name = "Admin")]
            public bool isAdmin { get; set; }
            [Display(Name = "Valide")]
            public bool isValide { get; set; }
     
            public int profilID;
     
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public DateTime createDate { get; set; }
     
        }
    Voici mon initializer

    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
    public class ErpInitializer: DropCreateDatabaseIfModelChanges<ErpContext>
        {
            protected override void Seed(ErpContext context)
            {
                //initialise les profils
                List<Profil> listeProfil = new List<Profil>();
                listeProfil.Add(new Profil { profilID = 1, profilDesc = "Admin" });
                listeProfil.Add(new Profil { profilID = 2, profilDesc = "Utilisateur" });
                //listeProfil.ForEach(s => context.Profils.Add(s));
                foreach (Profil p in listeProfil)
                {
                    context.Profils.Add(p);
                }
                context.SaveChanges();
                //initialise les user
                List<User> listeUser = new List<User>();
                listeUser.Add(new User { login = "test2", password = "test2",isAdmin=true,isValide=true,lastName=*"test2"*,firstName=*"test2",zipcode=*"2222",city=*"Olne",gsm=*"03333",profilID=1,createDate=DateTime.Now });
                listeUser.Add(new User { login = "test", password = "test",isAdmin=false,isValide=true,lastName=*"test",firstName=*"test",zipcode=*"1111",city=*"Olne",gsm=*"045333" ,profilID=2,createDate=DateTime.Now});
                listeUser.ForEach(s => context.Users.Add(s));
                context.SaveChanges();
     
            }
    Au moment du saveChanges des Users, j'ai l'exception DbUpdateException lancée.
    Une valeur Null générée par le magasin a été retournée pour un membre 'createDate' de type 'erp.Models.User' qui n'accepte pas les valeurs Null.

    Or en faisant un pas à pas, je vois bien que mes Users ont la date courante

    Merci de votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Pourquoi mettre l'attribut [DatabaseGenerated(DatabaseGeneratedOption.Identity)] sur createDate si tu dois toi-même assigner sa valeur dans le code explicitement ? Utilisé comme ça, l'attribut dit que c'est à la base de données d'attribuer une valeur lors de l'insertion.

    Vu que tu laisses le choix à la base de données d'assigner la valeur alors tu dois définir la valeur par défaut de la colonne correspondante à la propriété createDate pour que la valeur retournée soit correcte donc non nulle.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut
    Merci de votre éclaircissement.
    Il faudrait donc que j'enlève cet attribut pour définir le setter qui donne Datetime.Now ?

    Je me remets au dotnet 4ans après donc mes pats sont encore hésitants :-p

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bender86 Voir le message
    Il faudrait donc que j'enlève cet attribut pour définir le setter qui donne Datetime.Now ?
    Oui tu l'enlèves pour que l'assignation soit bien prise en compte lors de l'insertion si tu veux le faire toi-même de manière explicite dans le code.

    Autre chose, si tu es sûr que cette valeur restera toujours la date en cours (DateTime.Now) alors laisser la base de données s'en occuper est mieux en modifiant la "Valeur ou liaison par défaut" via SSMS pour la colonne createDate en mettant GETDATE(). Si tu choisis cette solution il faut cependant savoir les deux choses suivantes :
    • si tu es sûr que la valeur est attribuée qu'à l'insertion alors tu peux laisser ton attribut tel quel.
    • si la valeur doit changer lors de l'insertion et aussi lors de la mise à jour alors tu modifies l'attribut en mettant [DatabaseGenerated(DatabaseGeneratedOption.Compute)]

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut
    C'est à dire que si je veux laisser la db s'en charger et que pour le moment chaque fois que mon modèle change, la db est recréée, je dois retourner dans SSMS et lui mettre createDate()?

    Quid alors de l'initializer qui remplit les tables?

    merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bender86 Voir le message
    C'est à dire que si je veux laisser la db s'en charger et que pour le moment chaque fois que mon modèle change, la db est recréée, je dois retourner dans SSMS et lui mettre createDate()?
    Eh ben oui. Si la base de données est régénérée alors tu dois refaire la manipulation Donc autant le faire via le code pour t'éviter cela.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 306
    Points : 76
    Points
    76
    Par défaut
    MErci à vous.
    j'ai effectivement utilisé le getter pour initialiser la date de création dans le code.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bender86 Voir le message
    j'ai effectivement utilisé le getter pour initialiser la date de création dans le code.
    Je ne pense pas que ce soit que une bonne idée. Lors de l'insertion je suis d'accords tu auras la date d'aujourd'hui sauf que cette propriété te renverra toujours la date d'aujourd'hui même quand tu récupéreras des données insérées il y a 2 jours par exemple. Le getter n'est pas une bonne idée.

Discussions similaires

  1. Date par défaut dans un TextBox en Vba
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/01/2009, 08h10
  2. Date par défaut dans formulaire
    Par papagei2 dans le forum IHM
    Réponses: 11
    Dernier message: 07/11/2007, 06h21
  3. Désactiver la date par défaut dans un DateTimePicker
    Par Gaetch dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 25/07/2007, 15h43
  4. Réponses: 8
    Dernier message: 10/05/2007, 00h46
  5. [DATE]date par défaut dans un champ
    Par fabszn dans le forum DB2
    Réponses: 2
    Dernier message: 20/10/2006, 09h05

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