2011-12-25 7 views
4

Je viens de commencer à essayer le code EF4 ce matin et j'ai créé mes classes POCO, contexte de données et initialisation dans une bibliothèque de classe séparée, je crois que c'est le code type de plaque de chaudière. Je référence la classe dans une application MVC3 et définissez l'initialiseur dans Global.asax. Sur l'exécution de l'application, je remarque les problèmes suivants
1. Aucune base de données n'est créée nulle part (Ensuite, je ajoute une entrée dans le web.config pour une chaîne de connexion nommée après la classe Context, toujours aucun résultat)
2. Quand je essayer d'accéder aux valeurs initalized, j'obtiens une erreur nulle, évidemment parce qu'il n'y a pas de données.Entity Framework Code Première classe

Quelqu'un peut-il me aider avec s'il vous plaît conseils sur la façon d'obtenir thi chose à travailler (serait dommage si je passais tout mon apprentissage le jour de Noël et je ne peux toujours pas faire fonctionner :() Merci
ps J'ai essayé d'insérer des points de rupture et je frappe la méthode d'initialisation de l'application, mais il frappe jamais la méthode des semences dans le initialiseur même si j'ajouter un point de rupture là aussi !!
Merci.
Initializer classe

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Data.Entity; 
    using F2AController.Models; 

    namespace F2AController.DataObjects 
    { 
     public class F2AInitializer : DropCreateDatabaseAlways<F2AContext> 
     { 
      protected override void Seed(F2AContext context) 
      { 
       var countries = new List<Country> 
       { 
        new Country(){ CountryName="Germany", Active = true}, 
        new Country(){ CountryName="Britain", Active = true} 
       }; 
       countries.ForEach(s => context.Countries.Add(s)); 
       context.SaveChanges(); 
       var providers = new List<Providers>() 
       { 
        new Providers(){ ProviderName="InfoBip", ContactDetails="Rturo Manovic", Active=true, MessageRates= new List<ProviderRates>(){new ProviderRates(){ CountryId=1, DateCreated=DateTime.Now, DateModified=DateTime.Now, Rate=0.05M, Active=true}}} 
       }; 
       providers.ForEach(p => context.Providers.Add(p)); 
       context.SaveChanges(); 
       var usermobiles = new List<MobileTerminal>() 
       { 
        new MobileTerminal(){ Active= true, Credits=200, DateCreated=DateTime.Now, MSISDN="4477565444865"} 
       }; 
       usermobiles.ForEach(u => context.MobileTerminals.Add(u)); 

       context.SaveChanges(); 
      } 


     } 
    } 

Context Classe

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data.Entity; 

namespace F2AController.Models 
{ 
    public class F2AContext : DbContext 
    { 
     public DbSet<Country> Countries; 
     public DbSet<MobileTerminal> MobileTerminals; 
     public DbSet<Providers> Providers; 
     public DbSet<ProviderRates> ProviderRates; 
     public DbSet<Property> Properties; 
     public DbSet<ShortMessage> ShortMessages; 
     public DbSet<UserProperties> UserProperties; 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 
     } 
    } 
} 

Global.asax méthode d'initialisation App

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     Database.DefaultConnectionFactory = new SqlConnectionFactory(ConfigurationManager.ConnectionStrings["F2AContext"].ConnectionString); 
     Database.SetInitializer<F2AContext>(new F2AInitializer()); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 
    } 
+0

Pourquoi ne pas publier la classe d'initialisation? ou au moins la classe de contexte. – LueTm

Répondre

4

Eureka..finally!
En cherchant une solution, je suis tombé sur ce post Entity Framework Database.SetInitializer simply not working
En appliquant la solution suggérée ici pour forcer ma base de données à créer travaillé au démarrage comme je m'y attendais, mais alors lors de l'exécution du code de départ, il a jeté une exception null pointeur. En examinant, j'ai réalisé que toute tentative de référencer les collections DBSet de la classe Context a généré la même exception. Inspectant plus loin, je réalise qu'au lieu d'utiliser

public DbSet<MobileTerminal> MobileTerminals { get; set; } 

Je l'avais utilisé

public DbSet<MobileTerminal> MobileTerminals; 

Ce qui voulait dire que je n'ai pas eu l'initialisation d'objet implicite, d'où l'exception de pointeur NULL. J'ai supprimé le code d'initialisation forcée et j'ai lancé à nouveau l'application, cette fois-ci le code de départ ne s'est pas exécuté jusqu'à ce que j'accède à une page qui interroge le contexte de données et fonctionne parfaitement.
Apparemment, en raison du chargement paresseux, le code d'initialisation n'est pas exécuté jusqu'à ce qu'il soit réellement nécessaire, c'est-à-dire la première fois que le contexte de données est interrogé dans l'application.J'espère que cela aidera tous ceux qui ont le même problème à l'avenir.

+0

Un peu hors-sujet, mais un amusant à déboguer utilise le code ci-dessus avec 'DropCreateDatabaseIfModelChanges' au lieu de' DropCreateDatabaseAlways' (* face-palm * moment). Si vous êtes arrivé à cette page pour ce problème et que la solution ci-dessus ne fonctionne pas, vérifiez que vous n'avez pas fait cela. Un rapide travail consiste à le changer en 'DropCreateDatabaseAlways', ou simplement ajouter une propriété factice à votre modèle/supprimer la propriété dummy. –

0

La question est peut-être le vous connectionstring utilisez dans votre web.config.

Pour une utilisation SQL CE suivant

<add name="YourContext" 
    connectionString="Data Source=|DataDirectory|yourDB.sdf" 
    providerName="System.Data.SqlServerCe.4.0"/> 

Pour utiliser SQL Express suivante

<add name="YourContext" 
    connectionString="Data source=.\SQLEXPRESS;Integrated Security=True;Initial Catalog=YourDatabase;" 
    providerName="System.Data.SqlClient" /> 

Je suppose que cela devrait faire fonctionner les choses.

En outre, je pense que vous devriez regarder cet article EF Code First DB Initialization Using Web.Config. Il est préférable d'initialiser la base de données à partir de web.config plutôt que du fichier global.asax

+0

Salut, merci pour votre réponse. J'ai fait ça et toujours pas d'amour. J'ai essayé de vérifier la chaîne de connexion utilisée dans la méthode Application_Start et une chaîne de connexion SQl Express sans jeu initial. Ceci en dépit du fait que j'ai défini la chaîne de connexion int web.config AND dans un fichier app.config dans la bibliothèque de classes. Quelles sont vos pensées? Merci –

1

Je voulais partager un autre problème lors de l'utilisation d'une bibliothèque de classes pour le code & d'abord trébuché à travers ce post. J'ai eu mon code en premier les classes POCO et DataContext dans un projet de bibliothèque aussi et je voulais utiliser ce projet pour créer ma première base de données de code. J'ai découvert qu'il existe un indicateur -ProjectName avec lequel on peut spécifier le projet de bibliothèque de classes à rechercher lors de la création de la base de données.

add-migration -Name 'InitialCreate' -ProjectName 'MyProject.Data' 

    update-database -ProjectName 'MyProject.Data' 
+0

Dans la console du gestionnaire de packages, get-help enable-migrations -detailed ou get-help add-migration -detail pour voir d'autres indicateurs utiles pour la situation où DBContext et Entities sont dans une bibliothèque de classes mais la chaîne de connexion est en un autre projet – subsci

Questions connexes