Partage
  • Partager sur Facebook
  • Partager sur Twitter

Webservice REST : Création de la bdd ignorée

Le fichier Web.config ne semble pas pris en compte au lancement

    18 décembre 2020 à 16:13:54

    Bonsoir à tous,

    Je reviens avec un problème similaire au précédent, mais cette fois pour un webservice REST qui simule le catalogue CDiscount.

    Elle est basée sur Entity Framework Code First. Donc la base est sensée être générée par mon modèle de données.

    Au lancement de l'application, je demande que la base de données soit supprimée et recrée, mais rien ne se passe. Le fichier Web.config semble ignoré.

    Voici mon fichier Web.config: 

    <?xml version="1.0" encoding="utf-8"?>
    <!--
      Pour plus d'informations sur la configuration de votre application ASP.NET, visitez
      https://go.microsoft.com/fwlink/?LinkId=301880
      -->
    <configuration>
      <configSections>
            <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
            <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </configSections>
    	<connectionStrings>
    		<add name="ContexteBDD" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=CDiscount;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\CDiscount.mdf" providerName="System.Data.SqlClient" />
    		<!--ANCIENNE CHAINE DE CONNEXION
    		<add name="ContexteBDD" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=UniversiteRennes;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\UniversiteRennes.mdf" providerName="System.Data.SqlClient"/>
    	-->
    	</connectionStrings>
      <appSettings>
        <add key="webpages:Version" value="3.0.0.0" />
        <add key="webpages:Enabled" value="false" />
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
      </appSettings>
      <system.web>
        <compilation debug="true" targetFramework="4.7.2" />
        <httpRuntime targetFramework="4.7.2" />
      </system.web>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f" />
            <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
            <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-1.6.5135.21930" newVersion="1.6.5135.21930" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
          </dependentAssembly>
          <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-5.2.7.0" newVersion="5.2.7.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
      <system.codedom>
        <compilers>
          <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
          <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
        </compilers>
      </system.codedom>
      <entityFramework>
    	  <contexts>
    		
     <!--INITIALISEUR DE BDD ACTIVE-->
    		  <context type="WebserviceCatalogueCDiscount.DAL.BddCDiscount, WebserviceCatalogueCDiscount">
    			  <databaseInitializer  type="WebserviceCatalogueCDiscount.DAL.InitialisateurBDD, WebserviceCatalogueCDiscount" />
    		  </context> 
    	  </contexts>
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
      </entityFramework>
    </configuration>
    

    Voici mon contexte de base de données

    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Data.Entity.ModelConfiguration.Conventions;
    using System.Data.Linq;
    using System.Linq;
    using System.Web;
    using WebserviceCatalogueCDiscount.Models;
    
    namespace WebserviceCatalogueCDiscount.DAL
    {
        public class BddCDiscount : DbContext
        {
            public BddCDiscount() : base("ContexteBDD")
            {
                //Database.SetInitializer(new InitialisateurBDD());
            }
            public DbSet<Produit> Produits { get; set; }
    
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                //modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            }
    
    
        }
    
        
    }
     

    Et voici mon initialiseur de Bdd avec la méthode seed().

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using WebserviceCatalogueCDiscount.Models;
    
    namespace WebserviceCatalogueCDiscount.DAL
    {
    	public class InitialisateurBDD : System.Data.Entity.DropCreateDatabaseAlways<BddCDiscount>
    	{
    		protected override void Seed(BddCDiscount context)
    		{
    			var Produits = new List<Produit>
    				{
    				new Produit{Titre="ChaussuresA",Description="Cool",PrixHT=15.1, Fournisseur="Nike"},
    				new Produit{Titre="ChaussuresB",Description="Détendu",PrixHT=17.9, Fournisseur="Burton"},
    				new Produit{Titre="ChaussuresC",Description="Sportswear",PrixHT=21.3, Fournisseur="Nike"},
    				new Produit{Titre="ChaussuresD",Description="Sérieux",PrixHT=25.2, Fournisseur="LondonShoes"},
    				new Produit{Titre="ChaussuresE",Description="Classique",PrixHT=27.5, Fournisseur="Italo"},
    				new Produit{Titre="ChaussuresF",Description="Outdoor",PrixHT=29.2, Fournisseur="Reebook"},
    				new Produit{Titre="ChaussuresH",Description="Détendu",PrixHT=31.3, Fournisseur="Puma"},
    				};
    			Produits.ForEach(s => context.Produits.Add(s));
    			context.SaveChanges();
    		}
    	}
    }

    Et voici enfin mon entité Produit à générer dans la base de données en tant que table Produits.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.ComponentModel.DataAnnotations;
    
    namespace WebserviceCatalogueCDiscount.Models
    {
        public class Produit
        {
            [Key]
            private readonly int id;
    
            
            public int Id => id; 
            public string Titre { get; set; }
            public string Theme { get; set; }
            public string Description { get; set; }
            public string Fournisseur { get; set; }
            public double PrixHT { get; set; }
    
            public double PrixTTC { get; set; }
    
        }
    }
     


    Auriez-vous une piste ?

    Je sèche depuis une semaine.

    Merci.



    -
    Edité par HervéLabénère 18 décembre 2020 à 16:19:49

    • Partager sur Facebook
    • Partager sur Twitter
      18 décembre 2020 à 17:07:12

      il ne se passe rien puisque l'initialisateur est en commentaire (retire les // ça devrait mieux fonctionner) (peut-être aussi dans OnModelCreating) 

      //Database.SetInitializer(new InitialisateurBDD());

      Ta classe InitialisateurBDD n'est donc pas appelé

      https://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-first.aspx 

      -
      Edité par umfred 18 décembre 2020 à 17:07:20

      • Partager sur Facebook
      • Partager sur Twitter
        29 décembre 2020 à 12:16:13

        Merci Umfred,

        J'ai bien pensé que tu évoquerais cette cause possible d'erreur, à savoir que la fonction Database.SetInitializer apparaissait en commentaire.

        En réalité le problème se situait ailleurs. Car l'initialisation de la base de données était déjà présente dans le fichier Web.config.

        J'ai donc corrigé diverses erreurs dont une qui semblait bloquante : 

        J'ai remplacé : 

        [Key]
                private readonly int id;



        Par

          [Key]
                public int Id { get; set; }



        Car la description de l'erreur que j'aurais dû préciser avant, indiquait que la table Produits ne comportait pas de clé primaire.

        Je comprends que le fait que la propriété id soit initialement en lecture seule a pu empêcher la création du champ Id, son attribution comme clé primaire et finalement la génération de la table Produits. 

        -
        Edité par HervéLabénère 29 décembre 2020 à 12:20:32

        • Partager sur Facebook
        • Partager sur Twitter
          4 janvier 2021 à 13:02:41

          Si tu ne donnes pas toutes les infos, on répondra forcément à côté ...
          • Partager sur Facebook
          • Partager sur Twitter

          Webservice REST : Création de la bdd ignorée

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown