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 :

[MVC3 "razor"] Erreur lors de l'ajout d'un controlleur


Sujet :

Entity Framework

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 47
    Points : 34
    Points
    34
    Par défaut [MVC3 "razor"] Erreur lors de l'ajout d'un controlleur
    Bonjour à tous,

    Je suis étudiant en informatique, et j'ai commencé le C# il y 4 mois...

    Je suis actuellement en train de réaliser un projet dans le cadre du cours de Technologie Internet (.NET). Ce Projet consiste à réaliser une application Online de gestion de club (MVC 3 "razor" avec Bdd SQL)...Voilà un peu pour le contexte

    -Je suis en train d'utiliser l'Entity Framework 4.0 "Code First", c'est à dire que je code chacune de mes tables en classes pour ensuite créer une Bdd...

    Seulement je rencontre un message d'erreur lorsque je tente d'ajouter un contrôleur:

    Unable to retrieve metadata for 'TennisOnline.Models.Customer'. There is no store type corresponding to the EDM type 'Edm.Type 'Edm.Time(Nullable=true)' of primitive type 'Time'
    Classe "Customer "

    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
     
    namespace TennisOnline.Models
    {
        public class Customer
        {
            [Key]
            public int ID {get;set;}
     
            [Display(Name = "Code PIN")]
            [Column("Pin")]
            public int? Pin { get; set; }
     
            [Display(Name = "Nom")]
            [Column("Name")]
            [MaxLength(20, ErrorMessage = "Name cannot be longer than 20 characters.")]
            public string Name {get;set;}
     
            [Display(Name = "Prénom")]
            [Column("FirstName")]
            [MaxLength(30, ErrorMessage = "First Name cannot be longer than 30 characters.")]
            public string FirstName { get; set; }
     
            [Display(Name = "Mail")]
            [Column("Mail")]
            [MaxLength(30, ErrorMessage = "Mail cannot be longer than 30 characters.")]
            public string Mail { get; set; }
     
            [Display(Name = "Adresse")]
            [Column("Address")]
            [MaxLength(40, ErrorMessage = "Address cannot be longer than 40 characters.")]
            public string Address { get; set; }
     
            [Display(Name = "Ville")]
            [Column("City")]
            [MaxLength(20, ErrorMessage = "City cannot be longer than 20 characters.")]
            public string City { get; set; }
     
            [Display(Name = "Code postal")]
            [Column("PostalCode")]
            public int PostalCode { get; set; }
     
            [Display(Name = "Num. Tél")]
            [Column("PhoneNumber")]
            [MaxLength(20, ErrorMessage = "Phone number cannot be longer than 20 characters.")]
            public string PhoneNumber { get; set; }
     
            [Display(Name = "Num. Affiliation")]
            [Column("AffiliationNumber")]
            public int AffiliationNumber { get; set; }
     
     
     
        }
    }

    Classe "TennisOnlineContext"

    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
     
    namespace TennisOnline.DAL
    {
        public class TennisOnlineContext:DbContext
        {
            public DbSet<Customer> Customers { get; set; }
            public DbSet<Manager> Managers { get; set; }
            public DbSet<MemberCode> MemberCodes { get; set; }
            public DbSet<Reservation> Reservations { get; set; }
            public DbSet<Teacher> Teachers { get; set; }
            public DbSet<TennisClub> TennisClubs { get; set; }
            public DbSet<TennisCourt> TennisCourts { get; set; }
     
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            }
        }
    }

    Pouvez-vous m'aider SVP

    Merci

  2. #2
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Points : 4 574
    Points
    4 574
    Par défaut
    Bonjour,

    Entity Framework essaye de convertir ta propriété de type TimeSpan en type Time de SQL Server. Cependant, ce type n’existe pas sous SQL Server 2005, il n’est apparu que sous la version 2008.

    Il faut que tu changes le type de ta propriété.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 47
    Points : 34
    Points
    34
    Par défaut
    Merci beaucoup problème résolu !!

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 47
    Points : 34
    Points
    34
    Par défaut
    Mais j'ai un nouveau problème depuis 50 minutes

    J'ai suivi ce tuto : http://www.asp.net/mvc/tutorials/get...vc-application


    Dans ma classe "Inizializer" j'attribue des valeurs par défaut dans ma bdd :

    Classe en question:

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    namespace TennisOnline.DAL
    {
        public class TennisOnlineInitializer : DropCreateDatabaseIfModelChanges<TennisOnlineContext>
        {
            protected override void Seed(TennisOnlineContext context)
            {
     
                foreach (string line in File.ReadLines("/Content/Customer.csv"))
                {
                    string[] parts = line.Split(';');
     
                    Customer customer = new Customer();
                    customer.Pin = null;
                    customer.AffiliationNumber = int.Parse(parts[0]);
                    customer.Name = parts[1];
                    customer.FirstName = parts[2];
                    customer.Mail =String.Empty;
                    customer.Address = parts[3];
                    customer.PostalCode = int.Parse(parts[4]);
                    customer.City = parts[5];
                    customer.PhoneNumber = parts[6];
     
                    System.Diagnostics.Debug.WriteLine("test" + parts[5]);
     
                    context.Customers.Add(customer);
                    context.SaveChanges();
                }
     
                var managers = new List<Manager>
                {
                    new Manager { Pin = null, Name="Willems",FirstName="Jean-Marie",PhoneNumber="",Role="Président",AffiliationNumber=4005180 },
                    new Manager { Pin = null, Name="Angé",FirstName="Alain",PhoneNumber="",Role="Secrétaire et trésorier",AffiliationNumber=4034937 },
                    new Manager { Pin = null, Name="Beaujean",FirstName="Francis",PhoneNumber="",Role="Administrateur",AffiliationNumber=4010294 },
                    new Manager { Pin = null, Name="Follin",FirstName="Mario",PhoneNumber="",Role="Assistant travaux et entretien",AffiliationNumber=4005087 },
                    new Manager { Pin = null, Name="Gendarme",FirstName="Alain",PhoneNumber="",Role="Responsable de la publicité",AffiliationNumber=4032237 },
                    new Manager { Pin = null, Name="Angé",FirstName="Arnaud",PhoneNumber="",Role="Chargé des comptes de la commission des jeunes",AffiliationNumber=4013842 },
                    new Manager { Pin = null, Name="Angé",FirstName="Philippe",PhoneNumber="",Role="Sponsoring et organisation d'évènements",AffiliationNumber=4023069 },
                    new Manager { Pin = null, Name="Jonckeere",FirstName="Bernard",PhoneNumber="",Role="Chargé de la gestion des Interclubs",AffiliationNumber=4003851 },
                    new Manager { Pin = null, Name="Romedenne",FirstName="Guy",PhoneNumber="",Role="Chargé des relations avec la gérance",AffiliationNumber=4004295 },
                    new Manager { Pin = null, Name="Debont",FirstName="Cédric",PhoneNumber="",Role="Projet Couvert",AffiliationNumber=4016526 },
                    new Manager { Pin = null, Name="Laurent",FirstName="Cédric",PhoneNumber="",Role="Sponsoring",AffiliationNumber=4026588 },
                };
                managers.ForEach(s => context.Managers.Add(s));
                context.SaveChanges();
     
                var teachers = new List<Teacher>
                {
                    new Teacher {Name="Stein",FirstName="Guy",Pin=null,Mail="",AffiliationNumber=4002370 },
                    new Teacher {Name="Dalmans",FirstName="Marc",Pin=null,Mail="",AffiliationNumber=4005059 },
                    new Teacher {Name="Lopez",FirstName="Vincent",Pin=null,Mail="",AffiliationNumber=4023647 },
                    new Teacher {Name="Gendarme",FirstName="Alain",Pin=null,Mail="",AffiliationNumber=4032237 },
                    new Teacher {Name="Daune",FirstName="Eric",Pin=null,Mail="",AffiliationNumber=4035200 },
                    new Teacher {Name="Onclin",FirstName="Julien",Pin=null,Mail="",AffiliationNumber=4019038 },
                };
                teachers.ForEach(s => context.Teachers.Add(s));
                context.SaveChanges();
     
     
     
                var tennisClubs = new List<TennisClub>
                {
                    new TennisClub { Name="Tennis Club Visé",Address="Rue des 3 rois,1",City="Visé",PhoneNumber="043/794812" },
     
                };
                tennisClubs.ForEach(s => context.TennisClubs.Add(s));
                context.SaveChanges();
     
                var tennisCourts = new List<TennisCourt>
                {
                    new TennisCourt { Outside=true },
                    new TennisCourt { Outside=true },
                    new TennisCourt { Outside=true },
                    new TennisCourt { Outside=true },
                    new TennisCourt { Outside=true },
                    new TennisCourt { Outside=true },
                    new TennisCourt { Outside=true },
                    new TennisCourt { Outside=true },
                    new TennisCourt { Outside=true },
                    new TennisCourt { Outside=true },
                    new TennisCourt { Outside=false },
                    new TennisCourt { Outside=false },
                    new TennisCourt { Outside=false },
                };
                tennisCourts.ForEach(s => context.TennisCourts.Add(s));
                context.SaveChanges();
            }  
     
        }
    }
    Ensuite, j'ai bien ajouter la ligne là dans la méthode "Application.Start" de mon fichier "Global.asax" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Database.SetInitializer<TennisOnlineContext>(new TennisOnlineInitializer());
    Au lancement de l'application, je n'ai aucune valeur dans ma bdd Avez-vous une idée ?

    Merci d'avance

  5. #5
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Points : 4 574
    Points
    4 574
    Par défaut
    Et il n'y a pas de messages d'erreur ? Tu as bien configuré la connectionString ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 47
    Points : 34
    Points
    34
    Par défaut
    Aucun message d'erreur et ma connexion string :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     <add name="TennisOnlineContext" connectionString="Data Source=|DataDirectory|Tennis.sdf" providerName="System.Data.SqlServerCe.4.0 "/>

  7. #7
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Points : 4 574
    Points
    4 574
    Par défaut
    Et tu as bien vérifié le bon fichier .sdf comme fait dans le tuto ?

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 47
    Points : 34
    Points
    34
    Par défaut
    Oui oui j'ai bien la Bdd "Tennis.sdf" qui se créé et tous les tuples de mes tables sont vides...

  9. #9
    Invité
    Invité(e)
    Par défaut
    Un truc un peu bête mais qui peut aider : Arrêter le serveur ASP.Net Server (tu le verras dans la barre des tâches à côté de l'horloge).
    Relances ton application

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 47
    Points : 34
    Points
    34
    Par défaut
    Merci de vos réponses , j'ai essayé de relancer le server, aucune valeur ne s'insère dans mes tables

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 47
    Points : 34
    Points
    34
    Par défaut
    J'ai pourtant placé un point d'arrêt dans la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                RegisterGlobalFilters(GlobalFilters.Filters);
                RegisterRoutes(RouteTable.Routes);
                Database.SetInitializer<TennisOnlineContext>(new TennisOnlineInitializer()); //ici
            }
    Et mon Inizializer se lance pourtant bien

  12. #12
    Invité
    Invité(e)
    Par défaut
    Essaies ça :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    protected void Application_Start()
    {
          AreaRegistration.RegisterAllAreas();
          RegisterGlobalFilters(GlobalFilters.Filters);
          RegisterRoutes(RouteTable.Routes);
          Database.SetInitializer<TennisOnlineContext>(new TennisOnlineInitializer()); //ici
          TennisOnlineContext context = new TennisOnlineContext();
          context.Database.Initialize(true);
    }

    Ce n'est pas en définissant l'"initialiseur" que la méthode Seed sera appelée automatiquement mais uniquement en appelant la méthode Initialize comme je l'ai fait ci-dessus.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 47
    Points : 34
    Points
    34
    Par défaut
    Merci de la réponse rapide, mais toujours rien

    J'ai bien vérifier mon TennisOnlineContext et mes classes du modèle, je ne vois où j'aurais pu faire une erreur:

    TennisOnlineContext

    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
     
    namespace TennisOnline.DAL
    {
        public class TennisOnlineContext:DbContext
        {
            public DbSet<Customer> Customers { get; set; }
            public DbSet<Manager> Managers { get; set; }
            public DbSet<Reservation> Reservations { get; set; }
            public DbSet<Teacher> Teachers { get; set; }
            public DbSet<TennisClub> TennisClubs { get; set; }
            public DbSet<TennisCourt> TennisCourts { get; set; }
     
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            }
        }
    }
    Exemple de classe de mon modèle

    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
     
    namespace TennisOnline.Models
    {
        public class Manager
        {
            [Key]
            public int ID { get; set; }
     
     
            [Column("Pin")]
            public int? Pin { get; set; }
     
     
            [Column("Name")]
            [MaxLength(20, ErrorMessage = "Name cannot be longer than 20 characters.")]
            public string Name { get; set; }
     
     
            [Column("FirstName")]
            [MaxLength(30, ErrorMessage = "First Name cannot be longer than 30 characters.")]
            public string FirstName { get; set; }
     
     
            [Column("PhoneNumber")]
            [MaxLength(20, ErrorMessage = "Phone Number cannot be longer than 20 characters.")]
            public string PhoneNumber { get; set; }
     
     
            [Column("Role")]
            [MaxLength(40, ErrorMessage = "Role cannot be longer than 40 characters.")]
            public string Role { get; set; }
     
     
            [Column("AffiliationNumber")]
            public int AffiliationNumber { get; set; }
     
            public virtual TennisClub TennisClub { get; set; }
        }
    }

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 47
    Points : 34
    Points
    34
    Par défaut
    Mais en plaçant un point d'arrêt je vois qu'il ne rentre pas dans la méthode "Seed" ! Le problème vient de ce que tu m'as dit

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 47
    Points : 34
    Points
    34
    Par défaut
    Donc faudrait trouver un truc pour que la méthode "Seed" se lance

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2012
    Messages : 47
    Points : 34
    Points
    34
    Par défaut
    J'ai trouvé l'erreur !

    Pour ceux qui aurait le même problème à l'avenir:

    La classe "Inizializer" hérite de “DropCreateDatabaseIfModelChanges” ce qui veut dire qu’elle ne sera appelée que lorsque votre model aura subi des modifications.

    Et c’est aussi la raison pour laquelle la méthode “Seed” peut ne pas être appelée. En effet, si comme moi, procédant pas à pas, vous avez d’abord simplement fait généré votre base sur la base d’un model V1 sans utiliser de stratégie d’initialisation, et bien votre base sera déjà crée, sans données. Or avec ce type de stratégie, tant que votre model ne sera modifié, votre base se ne sera pas régénérée et donc votre stratégie d’initialisation que vous auriez créé par la suite ne sera jamais utilisée.

    Voilà Voilà

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/10/2005, 14h57
  2. Erreur lors de l'ajout d'une table
    Par FredMines dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 27/07/2005, 13h13

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