2012-02-14 2 views
0

J'ai un problème avec la reconstruction de DB après que le modèle a été modifié/mis à jour. J'ai trois table dans un fichier db "Posts", "Threads" et "Relations". Si je lance l'application et publie un nouveau fil, tout semble bien, je peux voir le fil. Si j'essaie d'ajouter un message sur le thread, il génère une erreur indiquant qu'il ne trouve pas de table nommée "Thread". Si je coche "Database Explorer" dans Visual Web Developer je ne peux voir que la table "Posts" qui est maladroit. Maintenant, j'ai lu quelque part que db n'est pas créé avant la première utilisation du modèle (économie?).Erreur d'application avec SQL CE 4.0 et ASP.NET MVC 3

Ma configuration des modèles est:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Data.Entity; 
using System.Data.Entity.Database; 
using System.ComponentModel.DataAnnotations; 
using System.Data.Entity.ModelConfiguration; 

namespace aspnet_forum.Models 
{ 
    public class Threads 
    { 
     public int ID { get; set; } 

     [Required] 
     public string Name { get; set; } 

     [Required] 
     public string Author { get; set; } 

     public DateTime Date { get; set; } 
     public string Slug { get; set; } 
    } 

    public class ThreadsDBContext : DbContext 
    { 
     public DbSet<Threads> Threads { get; set; } 

     protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      DbDatabase.SetInitializer(new MyThreadsDBContextInitializer()); 

      base.OnModelCreating(modelBuilder); 
     } 
    } 

    public class MyThreadsDBContextInitializer : DropCreateDatabaseIfModelChanges<ThreadsDBContext> 
    { 
     protected override void Seed(ThreadsDBContext dbContext) 
     { 
      // seed data 

      base.Seed(dbContext); 
     } 
    } 
} 

J'ai aussi utilisé "DropCreateDatabaseAlways" résultant même erreur. Le modèle Posts est le même que Thread avec un champ supplémentaire "text" et un nom Posts si pertinent.

modèle de relations:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 
using System.Data.Entity; 
using System.Data.Entity.Database; 
using System.Data.Entity.ModelConfiguration; 

namespace aspnet_forum.Models 
{ 
    public class Relations 
    { 
     public int ID { get; set; } 

     [ForeignKey("Threads")] 
     public int ThreadID { get; set; } 
     //public virtual Threads Thread { get; set; } 

     [ForeignKey("Posts")] 
     public int PostID { get; set; } 
     //public virtual Posts Post { get; set; } 
    } 

    public class RelationsDBContext : DbContext 
    { 
     public DbSet<Relations> Relations { get; set; } 

     protected override void OnModelCreating(ModelBuilder modelBuilder) 
     { 
      DbDatabase.SetInitializer(new MyRelationsDBContextInitializer()); 

      base.OnModelCreating(modelBuilder); 
     } 

    } 

    public class MyRelationsDBContextInitializer : DropCreateDatabaseIfModelChanges<RelationsDBContext> 
    { 
     protected override void Seed(RelationsDBContext dbContext) 
     { 
      // seed data 

      base.Seed(dbContext); 
     } 
    } 
} 

Mon web.config est:

<connectionStrings> 
    <add name="ThreadsDBContext" 
     connectionString="Data Source=|DataDirectory|Forum.sdf" 
     providerName="System.Data.SqlServerCe.4.0"/> 
    <add name="PostsDBContext" 
     connectionString="Data Source=|DataDirectory|Forum.sdf" 
     providerName="System.Data.SqlServerCe.4.0"/> 
    <add name="RelationsDBContext" 
      connectionString="Data Source=|DataDirectory|Forum.sdf" 
      providerName="System.Data.SqlServerCe.4.0"/> 
    </connectionStrings> 

J'ai essayé et créé toutes les tables et les relations à la main et tout cela fonctionne comme prévu, je ne sais juste pas si les relations fonctionneront comme prévu.

Essayer d'établir une relation M2M entre les threads, les postes et les relations.

PS: il existe une table "EdmMetadata".

Répondre

0

Vous devez ajouter les trois DbSets au même DbContext. Maintenant que j'ai relu votre question, je vois que Relations est en fait une relation plusieurs-à-un entre Post et Thread. Cette classe peut être omise.

Cela pourrait être votre nouvelle solution:

namespace aspnet_forum.Models 
{ 
    public class Thread 
    { 
     public int ID { get; set; } 

     [Required] 
     public string Name { get; set; } 

     [Required] 
     public string Author { get; set; } 

     public DateTime Date { get; set; } 
     public string Slug { get; set; } 

     public virtual ICollection<Post> Posts { get; set; } 
    } 

    public class Post 
    { 
     public int ID { get; set; } 

     [Required] 
     public string Title { get; set; } 

     [ForeignKey("Thread")] 
     public int ThreadId { get; set; } 
     public virtual Thread Thread { get; set; } 
    } 

    public class ForumContext : DbContext 
    { 
     public DbSet<Thread> Threads { get; set; } 
     public DbSet<Thread> Posts { get; set; } 
    } 
} 

Remarquez comment Thread a une collection de Post s et comment Post a une Thread. Cela remplace votre classe Relationships.

Maintenant, vous aussi seulement besoin d'une chaîne de connexion:

<connectionStrings> 
    <add name="ForumContext" 
     connectionString="Data Source=|DataDirectory|Forum.sdf" 
     providerName="System.Data.SqlServerCe.4.0" /> 
</connectionStrings> 
+0

Dans quelle classe modèle dois-je mettre ceci ou je fais nouvelle classe pour cela? – daniyel

+0

Ce devrait être une classe séparée. Je mettrai à jour ma réponse pour le démontrer. –

+0

Je l'ai fonctionné maintenant. Merci de votre aide. Il ne reste plus que la récupération de tous les messages relatifs à l'ID de fil ou à la limace. Je l'ai eu comme ceci: dbForum.Posts.Include (t => t.Thread) .GroupBy (t => t.Slug == threadSlug) mais je ne sais pas comment aller chercher ... – daniyel