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 :

Créer un base de donnée SQLite avec Entity Framework


Sujet :

Entity Framework

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 76
    Points : 210
    Points
    210
    Par défaut Créer un base de donnée SQLite avec Entity Framework
    Bonjour,

    après plusieurs test et plusieurs recherches infructueuse sur le net je ne parviens toujours pas à créer un base de donnée SQLite avec EntityFramework

    Pour le test je veux juste créer une base de donnée avec une table ("Revenue") contenant elle même 2 colonne : id et une colonne de type Int "Somme"

    pour la classe Revenue j'ai procédé ainsi :

    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
     
    using System.Threading.Tasks;
    using System.Data; 
    using System.Data.SQLite;
    using System.Data.SQLite.EF6;
    using System.Data.SQLite.Linq;
    using System.ComponentModel.DataAnnotations;
    namespace ClassesEtatFinance
    {   
     
        [Table("SOMME")]
        public class Revenue
        {
            [Key]
            [DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
            public int Id { get; set; }
     
            [Required]
            public int Somme { get; set; }     
     
     
        }
    }
    Voilà le context :
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.SQLite;
    using System.Data.Entity;
    using ClassesEtatFinance;
    using System.Data.Entity.ModelConfiguration.Conventions;
    using DaoEtatFinance.Configuration;
     
    namespace DaoEtatFinance.Configuration
    {
        public class SqliteContext : DbContext
        {
            private string _dbPath;
     
            private SQLiteFactory sqliteFactory;
     
            private SQLiteConnection sqliteConnection;
     
            public SqliteContext()
                : base(new SQLiteConnection
                {
                    ConnectionString = new SQLiteConnectionStringBuilder
                    {
                        DataSource = "name=TestBaseSqLite",
                        ForeignKeys = true,
                        BinaryGUID = false,
                    }.ConnectionString
                }, true)
            {
                _dbPath = "name=TestBaseSqLite";
            }
     
     
            public DbSet<Revenue> Revenue { get; set; }
     
     
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
     
               modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
               Database.Initialize(true);
                //Database.SetInitializer(new SqliteContextInitializer<SqliteContext>(_dbPath, modelBuilder));
            }
        }
    }
    voilà le contextInitializer :
    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity;
    using System.Linq;
    using System.Reflection;
    using System.ComponentModel.DataAnnotations;
    using System.Diagnostics;
    using System.IO;
    using System.Collections;
    using System.Data.Entity.Core.Metadata.Edm;
    using System.Data.Entity.Infrastructure;
    using System.Data.Entity.Infrastructure.Annotations;
     
    namespace DaoEtatFinance.Configuration
    {
        class SqliteContextInitializer : DropCreateDatabaseIfModelChanges<SqliteContext>
        {
     
        }
    et enfin pour la création de la base :
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    using DaoEtatFinance.Configuration;
     
    using System.Data.Entity;
     
    using System.Data.SQLite;
     
    namespace CreateSqLiteBaseConsole
    {
        class Program
        {
            static void Main(string[] args)
            {          
                 using( var context =  new SqliteContext() )
                 {
                     context.Database.Initialize(false) ;
                 }
     
            }
        }
    }
    Je me suis inspiré de cette explication-ci : https://gist.github.com/flaub/1968486e1b3f2b9fd

    Mon problème c'est qu'au lancement j'ai une erreur m'indiquant que je n'ai pas mis en place de SqLiteFatory je ne sais pas où le mettre) et quand je le met en place dans le context ça marche : il me crée un base SQLEXPRESS ! Mais moi je veux qu'il me créer un base SQLITE !

    Je sais que je ne m'y prend pas comme il faut...

    Est-ce que créer un base SqlLite avec entity est possible réellement ? et si oui si quelqu'un l'a déjà fait je suis tout ouïe pour la solution

    Merci par avance de m'avoir lu

  2. #2
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 527
    Points : 5 195
    Points
    5 195
    Par défaut
    Salut, je ne sais pas si ton problème est résolu ou non.

    Si ce n'est pas le cas, as-tu entré les bonnes informations dans le fichier "app.config" ?

    Si tu n'as pas résolu ton problème, il faudrait que tu postes le contenu du fichier
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 76
    Points : 210
    Points
    210
    Par défaut
    Oui j'y suis enfin parvenue !

    Donc on peut créer une base donnée Sqlite avec Entity Framework, par contre le piège c'est que lors de l'installation de la dll avec Nuget, le système remplit automatiquement l'App.config
    OR en fouinant dans diverse forum je me suis aperçu que beaucoup on galéré aussi et qu'en réalité l'App.config est préremplie de manière erroné. voici le fichier d'App.config qui fonctionne :
    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
    <?xml version="1.0" encoding="utf-8"?>
    <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>
    
      <appSettings>
        
      </appSettings>
    
      <connectionStrings>
        <add name="NomdeMaBase" connectionString="Data Source=c:\NomDuDossierDeMaBase\NomdeMaBase.sqlite;Initial Catalog=NomdeMaBase;Integrated Security=True;MultipleActiveResultSets=True;" providerName="System.Data.SQLite" />
       
      </connectionStrings>
      
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
      </startup>
      <system.data>
        <DbProviderFactories>
          <remove invariant="System.Data.SQLite" />
         
          <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    
        </DbProviderFactories>
      </system.data>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="mssqllocaldb" />
          </parameters>
        </defaultConnectionFactory>
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
          <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
          <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
        </providers>
      </entityFramework>
    </configuration>
    J'ai mis en rouge et gras ce qu'il faut bien vérifier, si ce n'est pas écrit comme ça, ça ne fonctionnera pas. A ce que j'ai compris c'est un problème de nom de provider.

    Pour la suite j'ai galéré pour crée les tables, et j'ai du chercher et trouver une class qui construit automatiquement les tables et colonnes etc... alors qu'avec SqlServer nous n'avons pas ce pb.

    J'espère que ça a pu aider.

    J'ai l'impression qu'EntityFramework et Sqlite c'est pas le grand amour mais comme ça, ça fonctionne

  4. #4
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Salut,

    L'équipe ADO.NET est en train de réécrire EF.
    Je pense que cela sera plus facile (d'utiliser SQLite, car les dlls seront mieux architecturées et on pourra choisir seulement ce que l'on a besoin) avec la future version EF7.

    ==> Un peu de patience, je pense qu'il sont en train de faire un truc pas trop mal

  5. #5
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 527
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 527
    Points : 5 195
    Points
    5 195
    Par défaut
    Citation Envoyé par RSS13 Voir le message
    Oui j'y suis enfin parvenue !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
          <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
          <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
        </providers>
      </entityFramework>
    </configuration>
    tu peux virer le provider System.Data.SqlClient si tu ne t'en sert pas

    Pour ce qui est de la connectionString, au besoin j'utilise la classe System.Data.SQLite.SQLiteConnectionStringBuilder pour la générer et ensuite de copie/colle le résultat de la propriété ConnectionString dans mon app.config

    Citation Envoyé par RSS13 Voir le message
    Pour la suite j'ai galéré pour crée les tables, et j'ai du chercher et trouver une class qui construit automatiquement les tables et colonnes etc... alors qu'avec SqlServer nous n'avons pas ce pb.
    Effectivement avec Entity Framework, la génération de la base de données n'est pas gérée.
    Tu peux le faire à la main, ou utiliser un orm (sqlite.net ou NServiceKit.OrmLite).

    Qu'est-ce que tu as utilisé comme classe ?
    Citation Envoyé par katkiller Voir le message
    Salut,

    L'équipe ADO.NET est en train de réécrire EF.
    Je pense que cela sera plus facile (d'utiliser SQLite, car les dlls seront mieux architecturées et on pourra choisir seulement ce que l'on a besoin) avec la future version EF7.

    ==> Un peu de patience, je pense qu'il sont en train de faire un truc pas trop mal
    je n'ai pas testé, mais EF7 est disponible ici :
    https://github.com/aspnet/EntityFramework
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  6. #6
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2014
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 76
    Points : 210
    Points
    210
    Par défaut
    ok
    merci pour les sources je regarderai à l'occasion pour EF7

    Pour info la classe que j'ai utilisé c'est celle-là, je l'ai trouvé sur un forum :

    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
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity;
    using System.Linq;
    using System.Reflection;
    using System.ComponentModel.DataAnnotations;
    using System.Diagnostics;
    using System.IO;
    using System.Collections;
    using System.Data.Entity.Core.Metadata.Edm;
    using System.Data.Entity.Infrastructure;
    using System.Data.Entity.Infrastructure.Annotations;
     
    namespace SuiviCollab.Dal.Configuration
    {
        class SqliteContextInitializer<T> : IDatabaseInitializer<T>
        where T : DbContext
        {
            bool _dbExists;
            DbModelBuilder _modelBuilder;
     
            public SqliteContextInitializer(string dbPath,DbModelBuilder modelBuilder)
            {
                _dbExists = File.Exists(dbPath);
                _modelBuilder = modelBuilder;
            }
     
            public void InitializeDatabase(T context)
            {
                if (_dbExists)
                    return;
     
                var model = _modelBuilder.Build(context.Database.Connection);
     
                using (var xact = context.Database.BeginTransaction())
                {
                    try
                    {
                        CreateDatabase(context.Database, model);
                        xact.Commit();
                    }
                    catch (Exception)
                    {
                        xact.Rollback();
                        throw;
                    }
                }
            }
     
            class Index
            {
                public string Name { get; set; }
                public string Table { get; set; }
                public List<string> Columns { get; set; }
            }
     
            private void CreateDatabase(Database db, DbModel model)
            {
                const string tableTmpl = "CREATE TABLE [{0}] (\n{1}\n);";
                const string columnTmpl = " [{0}] {1} {2}"; // name, type, decl
                const string primaryKeyTmpl = " PRIMARY KEY ({0})";
                const string foreignKeyTmpl = " FOREIGN KEY ({0}) REFERENCES {1} ({2})";
                const string indexTmpl = "CREATE INDEX {0} ON {1} ({2});";
     
                var indicies = new Dictionary<string, Index>();
     
                foreach (var type in model.StoreModel.EntityTypes)
                {
                    var defs = new List<string>();
     
                    // columns
                    foreach (var p in type.Properties)
                    {
                        var decls = new HashSet<string>();
     
                        if (!p.Nullable)
                            decls.Add("NOT NULL");
     
                        var annotations = p.MetadataProperties
                        .Select(x => x.Value)
                        .OfType<IndexAnnotation>();
     
                        foreach (var annotation in annotations)
                        {
                            foreach (var attr in annotation.Indexes)
                            {
                                if (attr.IsUnique)
                                    decls.Add("UNIQUE");
     
                                if (string.IsNullOrEmpty(attr.Name))
                                    continue;
     
                                Index index;
                                if (!indicies.TryGetValue(attr.Name, out index))
                                {
                                    index = new Index
                                    {
                                        Name = attr.Name,
                                        Table = type.Name,
                                        Columns = new List<string>(),
                                    };
                                    indicies.Add(index.Name, index);
                                }
                                index.Columns.Add(p.Name);
                            }
                        }
     
                        defs.Add(string.Format(columnTmpl, p.Name, p.TypeName, string.Join(" ", decls)));
                    }
     
                    // primary keys
                    if (type.KeyProperties.Any())
                    {
                        var keys = type.KeyProperties.Select(x => x.Name);
                        defs.Add(string.Format(primaryKeyTmpl, string.Join(", ", keys)));
                    }
     
                    // foreign keys
                    foreach (var assoc in model.StoreModel.AssociationTypes)
                    {
                        if (assoc.Constraint.ToRole.Name == type.Name)
                        {
                            var thisKeys = assoc.Constraint.ToProperties.Select(x => x.Name);
                            var thatKeys = assoc.Constraint.FromProperties.Select(x => x.Name);
                            defs.Add(string.Format(foreignKeyTmpl,
                            string.Join(", ", thisKeys),
                            assoc.Constraint.FromRole.Name,
                            string.Join(", ", thatKeys)));
                        }
                    }
     
                    // create table
                    var sql = string.Format(tableTmpl, type.Name, string.Join(",\n", defs));
                    db.ExecuteSqlCommand(sql);
                }
     
                // create index
                foreach (var index in indicies.Values)
                {
                    var columns = string.Join(", ", index.Columns);
                    var sql = string.Format(indexTmpl, index.Name, index.Table, columns);
                    db.ExecuteSqlCommand(sql);
                }
            }
        }
    }

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 03/07/2015, 19h56
  2. Lire une base de donnée sqlite avec sql.js
    Par clo_ljk dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/08/2014, 13h26
  3. Accès sources de données différentes avec Entity Framework
    Par chris1977 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 05/09/2012, 09h43
  4. Ouverture base de données SQLite avec QT
    Par MlleMR dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/12/2008, 19h53

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