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 MVC Discussion :

[EF code first]Probleme de dateTime interprété comme dateTime2


Sujet :

ASP.NET MVC

  1. #1
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut [EF code first]Probleme de dateTime interprété comme dateTime2
    Bonjour,

    J'utilise le type DateTime de ASP.NET dans une appli MVC avec l'entity Framework.
    The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.The statement has been terminated.
    Donc apparement, le EF renvoi un dateTime2 alors que je lui spécifie un dateTime simple.
    J'ai lu qu'il fallait modifier un parametre dans le .edx. Or étant en First Code, je ne sais pas où est situé le .edx (voir même s'il est stocké quelque part après génération).

    Si certains ont déjà rencontré le probleme, ça m'aiderait à avancer.

  2. #2
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Ca serai pas plutôt que ta base de données a une colonne datetime et que tu mets une valeur trop petite dedans ? (<1970)

  3. #3
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    J'utilise code first, donc quand j' "exécute" mon appli, le EF génère la base à partir des classes de mon modèle. Ainsi je n'ai pas la main sur ma base de données. Le seul moment où je peux préciser qu'il s'agit d'un dateType, c'est dans mon modèle.

    Les dates que j’insère sont de cette année, donc supérieur à 1970. De plus, j'utilise la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateTime.Parse("2011-03-17");
    .
    avant d’insérer l'enregistrement.

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par john85 Voir le message
    J'utilise code first, donc quand j' "exécute" mon appli, le EF génère la base à partir des classes de mon modèle. Ainsi je n'ai pas la main sur ma base de données. Le seul moment où je peux préciser qu'il s'agit d'un dateType, c'est dans mon modèle.

    Les dates que j’insère sont de cette année, donc supérieur à 1970. De plus, j'utilise la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateTime.Parse("2011-03-17");
    .
    avant d’insérer l'enregistrement.
    Heureusement, les ptits gars de Microsoft on pensé à ce cas de figure!
    Ca s'appelle Fluent API et ca te permet de preciser comment est crée ta base de donnée si tu veux des trucs un peu tricky
    http://blogs.msdn.com/b/adonet/archi...i-samples.aspx

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Points : 2 331
    Points
    2 331
    Par défaut
    C'est zarb quand même oO
    C'est quoi ta base de données ?

    L'histoire du datetime2 me parlait, je viens de retrouver quoi : http://blog.developpez.com/jerome/p9...avec-sql-2005/

    Mais j'ai peur que ça ne corresponde pas à ton cas !

  6. #6
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Arnard=> c'est le post que j'avais lu pour dire que c'était un bug de EF et que de ce fait, je ne pouvais pas changer le XML du edx car je n'ai aucune interaction avec ma base générée automatiquement,

    Nathanael=> je suis en plein dans la fluent API...et en train de lire ce post, mais c'est pour régler un bug que j'ai au niveau d'un conflit dans mes relation, elles ne passent apparement pas avec les DataAnnotations, mais c'est une autre histoire, je ferais un post si vraiment j'ai un problème.

    J'avais pas du tout pensé à utiliser le fluent API pour régler ce problème de type, merci pour la suggestion, je vais regarder si c'est possible, mais juste dans cette page, ils ne parlent pas de changement de type. Je devrais demander à la base de mettre une colonne de type DateTime quand je spécifie un attribut DateTime? Ou alors je definis ma colonne comme étant un DateTime pour forcer le type?
    Je ne vois pas vraiment comment dire au EF de laisser le type DateType classique, étant donné que c'est le rôle de l'attribut DateType de la classe model ,normalement.

    Le MVC3 est bien vaste

    Edit: j'ai lu le passage sur le Inheritance Table Mapping..pas compris, ça sert à quoi? Rien que le terme Mapping de table d'héritage me dit rien, si vous avez des eclaircissements, merci

  7. #7
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut Conclusion?
    J'ai donc laissé de coté mon DateType pour traiter une autre erreur que j'avais. J'avais donc laissé le type DateType dans mon model, vu que l'autre erreur arrivait avant. J'ai résolu cette erreur et je lance l'appli,elle fonctionne bien. Donc je regarde dans mes modèles, j'ai bien un DataType et il rentre bien en base en temps que tel .Je n'ai pas ajouter une ligne pour que ça marche, peut-être à force de régénérer la base à cause de l'erreur, enfin je comprends pas, mais j'ai un champs en DateType qui fonctionne.

    je pense que le problème n'est pas résolu mais bon, je reviendrais quand j'aurais à nouveau le problème...l'informatique c'est rarement magique

    Edit: Le probleme est toujours présent apres regeneration de la base. Donc Up.

  8. #8
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Citation Envoyé par john85 Voir le message
    Edit: j'ai lu le passage sur le Inheritance Table Mapping..pas compris, ça sert à quoi? Rien que le terme Mapping de table d'héritage me dit rien, si vous avez des eclaircissements, merci
    Pour une petite appli d'entrainement j'avais fait ca: une classe abstraite Employee et deux classes concretes Doctor et Nurse héritant de Employee.
    Ainsi, tu peux soit avoir une table Employee, une Doctor et une Nurse: il te fait la jointure, soit avoir une table Employee qui regroupe tout avec des valeurs à null pour une colonne de Nurse chez un Doctor (et vice versa)

  9. #9
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Ok, merci pour l'explication, je vais laisser par defaut en TPH, j'ai un seul heritage pour l'instant et ça marche à peu pres comme tel. Sinon, j'ai a nouveau ce probleme de DateTime2 qui ne passe pas...

    Bonne journée

  10. #10
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Bonjour à tous,

    Je me suis remis sur mon probleme de DateType. Pour résumer, j'ai dans ma classe 4 champs de type DateType. Ce matin, j'ai juste mis mon premier champ avec le type DateType. Ce champ représente la Date de creation d'une demande. Ainsi dans mon Initializer, je donnais une valeur a tous mes enregistrement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
         new Demande { Titre = "Demande d'une plus grande portée radio",   VendeurID = 1 , ResponsableID=null,  EtatValue=0, Description="possibilité d'avoir une telecommande à une distance de 600metres qui capte les données transmises par le capteur",Date_Demandee=  DateTime.Parse("2011-05-10")},
     
                   new Demande { Titre = "Demande d'un port usb ",  VendeurID = 1, ResponsableID=null,  EtatValue=0, Description="possibilité de relier le module à un ecran geant en bas de la grue",  Date_Demandee= DateTime.Parse("2011-03-17") },
     
                   new Demande { Titre = "Representation 3D",    VendeurID = 2  , ResponsableID=null,  EtatValue=0, Description="Il nous faudrait une representation 3D de la grue en mouvement",  Date_Demandee= DateTime.Parse("2011-05-04")},
     
                    new Demande { Titre = "Capter la radio",    VendeurID = 2  , ResponsableID=null,  EtatValue=0, Description="capter RTL2 dans la cabine", Date_Demandee= DateTime.Parse("2011-05-06") }
    J'ai laissé mes 3 autres champs au type string. Et là, ça marche nickel. du coup, j'ai mis mon deuxieme champ au type DateTime et là, ça marche plus...du coup je pense que c'est un probleme d'initialisation. En effet, j'ai ensuite essayer de mettre mon deuxieme champ à null:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Date_prise_en_charge = null
    Et il me sort une erreur comme quoi il ne peut pas convertir un DateTime parcequ'il ne peux pas etre null...

    Du coup, j'ai complété mes enregistrement en ajoutant un:"Date_prise_en_charge = DateTime.Now" à la fin de tout mes enregistrement et ça marche.

    Le problème, c'est que quand par la suite je veux prendre en charge ma demande, la valeur de l'enregistrement remplit le champ. Or j'aimerais avoir la date du jour où l'utilisateur prend en charge la demande.
    ça avance, je vais y arriver!

    //Edit J'ai trouvé une solution, un peu tirée par les cheveux,certe, enfin dans mon controller qui renvoi le formulaire qui contient les infos sur ma demande, je modifie la date de prise en charge au jour actuel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //
            // GET: /Gererdemande/Acceptation
            //Suite au clique sur le bouton accepter, propose le form d'acceptation
            public ActionResult Accepter(int id)
            {
                ViewBag.Responsables = db.Responsables;
                Demande laDemande = db.Demandes.Find(id);
                laDemande.Date_prise_en_charge = DateTime.Now;
                db.Entry(laDemande).State = EntityState.Modified;
                db.SaveChanges();
                return View(laDemande);
            }
    De cette manière, j'ai bien mon champs qui se remplit correctement.S'il y a plus propre ou plus pratique, je suis preneur. Sinon, comment n'avoir que la date et pas la date et l'heure. Pour l'instant j'ai :
    2011-05-17 09:11:49

    et je voudrais

    2011-05-17

  11. #11
    Membre du Club
    Inscrit en
    Avril 2011
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2011
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    J'ai fini par trouver en regardant la doc sur le DateTime:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string date = item.Date_acceptee.Date.ToString("d");
    Cela m'affiche bien la forme voulue : 2011-05-17

    Le probleme, c'est que je suis obligé de le transformer en string. Or je place ces dates dans un tableau, et je fais un tri par date de la plus récente à la plus vieille et inversement. Donc en convertissant ces dates, la comparaison n'est plus chronologique. Je suis donc condamné à laisser l'heure derriere Toujours est-il que le problème de DateTime est résolu

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

Discussions similaires

  1. erreur 26 - probleme de connexion à SQL SERVER en Code First
    Par splinternabs dans le forum Entity Framework
    Réponses: 7
    Dernier message: 29/01/2014, 23h58
  2. Réponses: 5
    Dernier message: 15/06/2006, 12h03
  3. Erreur de code ou probleme avec le débugger
    Par croc14 dans le forum MFC
    Réponses: 8
    Dernier message: 07/06/2006, 14h15
  4. Probleme <div> et float -> comme un tableau!
    Par elraton dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 19/08/2005, 19h49

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