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

Dotnet Discussion :

[EF4] Type de données et SQL


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut [EF4] Type de données et SQL
    Bonjour,

    bien qu'en général je préfère poster sur les forums appropriés, je sais par expérience, que personne n'y répondra, aussi vais-je poster ici, où le passage est plus important.

    J'utilise Entity Framework et les POCO Entities... jusque là tout va bien.
    Sous mon modèle objet j'ai recours à des objets de types TimeSpan... jusque là tout va bien également...

    Seulement là où plus rien ne va... c'est que EF4 mappe le type .NET TimeSpan par le type SQL TIME... hors ces deux types ne sont pas identiques, bien au contraire.

    En effet, TIME ne permet de stocker qu'une heure située entre 00:00:00 et 23:59:59... donc le décalage horaire journalier.
    Le type TimeSpan de .NET lui peut stocker autant d'heures que l'on souhaite... puisqu'il peut stocker des durées sur plusieurs jours...

    Or c'est de cet spécificité dont j'ai besoin, côté objet j'ai bien besoin de TimeSpan pour stocker des durées pouvant aller à plusieurs jours (plusieurs fois 24h) et le type TIME ne supporte que le 24h...

    Donc comment faire ?
    Peut-on obliger EF4 à mapper le type CLR TimeSpan à autre chose qu'à un type TIME ?
    peut-on par exemple l'obliger à utiliser un double (vu que TimeSpan possède une conversion dans les 2 sens en double) ou dans un entier et représenter ainsi le nombre de secondes ?

    Pour moi c'est plus qu'important car un simple changement de type SQL me permettrais de ne pas changer tout le code d'un projet qui est déjà censé être en production et qui représente plusieurs centaines de milliers de lignes de code... et m'économiserait de changer une partie de la logique en restockant les valeurs manuellement sous forme de secondes...

    Nota pour moi il est impossible d'envisager autre chose que des types TimeSpan ne serait ce qu'à cause de toute l'interface GUI écrite en WPF MVVM... cela obligerait à faire beaucoup trop de modifications...

    DE même en plus de mes timespan, il est obligatoire pour moi de stocker plus que 24h pour une durée...

    Si quelqu'un à une idée ou sais comment faire je suis tout ouie.

    Merci par avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Il est probablement possible de changer le type mappé, mais j'avoue que je ne sais pas comment... peut-être en éditant directement le SSDL

    Sinon, une solution simple : dans ton modèle, définis la propriété comme un long, et ajoute une propriété non mappée pour faire la conversion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Propriété mappée
    public virtual long DurationTicks { get; set; }
     
    // Propriété non mappée
    public Timestamp Duration
    {
        get { return Timestamp.FromTicks(DurationTicks); }
        set { DurationTicks = value.Ticks; }
    }
    C'est pas très élégant, mais au moins ça devrait permettre de régler le problème sans faire un gros refactoring...

  3. #3
    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 : 39
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Il est probablement possible de changer le type mappé, mais j'avoue que je ne sais pas comment... peut-être en éditant directement le SSDL

    Sinon, une solution simple : dans ton modèle, définis la propriété comme un long, et ajoute une propriété non mappée pour faire la conversion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Propriété mappée
    public virtual long DurationTicks { get; set; }
     
    // Propriété non mappée
    public Timestamp Duration
    {
        get { return Timestamp.FromTicks(DurationTicks); }
        set { DurationTicks = value.Ticks; }
    }
    C'est pas très élégant, mais au moins ça devrait permettre de régler le problème sans faire un gros refactoring...
    Je confirme cette méthode, c'est ce que j'utilise pour les enums

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Ok merci pour votre aide,

    effectivement c'est ce que je craignait... bon ba voilà une limitation de plus de EF4...
    enfin bon je pense pas que j'aurais été plus sauvé avec NHibernate sur ce coup là.

    Je vais utiliser cette technique, vais devoir renommer le champ réel dans le schéma, et dans la base

    Merci encore.

    Enfin bon la question reste ouverte si quelqu'un connait une technique plus "propre"

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

Discussions similaires

  1. [SQL S2K] Pb avec type de données
    Par Tankian dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/06/2006, 10h16
  2. [SQLServer2000][SQL] Récupérer un type de donnée.
    Par maldufleur dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/04/2006, 09h01
  3. Type de données Oracle 9-10 et SQL Server 2000
    Par fabrice_bruxelles dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 05/10/2005, 11h21
  4. Type de donnée image sous Sql Server Dba
    Par Vanesse dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/05/2004, 11h43
  5. Convertir un type de donnée sous SQL Server
    Par Fleep dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/08/2003, 15h15

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