2012-02-14 11 views
0

モデルが変更/更新された後でdbの再構築に問題があります。私は1つのDBファイル "ポスト"、 "スレッド"と "関係"の中に3つのテーブルを持っています。私はアプリを実行し、新しいスレッドをすべてポストすると、私はスレッドを見ることができます。スレッドに投稿を追加しようとすると、名前の「スレッド」でテーブルを見つけることができないというエラーがスローされます。私がVisual Web Developerで "データベースエクスプローラ"をチェックすると、テーブル "Posts"しか見ることができません。今では、モデルの最初の使用(保存?)までdbが作成されていないところを読んでいます。SQL CE 4.0とASP.NET MVC 3でアプリケーションエラーが発生しました

私のモデルのセットアップは次のとおりです。私も同じエラーを得られた "DropCreateDatabaseAlways" を使用

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); 
     } 
    } 
} 

。投稿モデルはスレッドと同じで、追加のフィールド "text"と関連する投稿名が付いています。

関係モデル:

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); 
     } 
    } 
} 

私のWeb.Configは次のとおりです。

<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> 

私が試したし、作成したすべてのテーブルとの関係を、手で、予想されるように、すべてが動作する私はちょうどかどうかを知りません関係は期待どおりに機能します。

スレッド、投稿、リレーションテーブル間のM2M関係を確立しようとしています。

PS: "EdmMetadata"テーブルがあります。

答えて

0

3つのDbSetをすべて同じDbContextに追加する必要があります。あなたの質問をもう一度読んだので、Relationsは実際にはPostThreadの多対1の関係になっています。このクラスは省略することができます。

この

はあなたの新しいソリューションが考えられます。

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; } 
    } 
} 

ThreadPostのコレクションを持っており、PostThreadを持っているかに注意してください。これにより、Relationshipsクラスが置き換えられます。私はこれを置くか、私はこのために新しいクラスを作る行う必要があります

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

たモデルクラスでは:

今、あなたはまた、唯一の接続文字列を必要ですか? – daniyel

+0

これは別のクラスである必要があります。私はこれを実証するために私の答えを更新します。 –

+0

私はそれが今働いている。ご協力いただきありがとうございます。現在残っているのは、スレッドIDまたはスラッグに関連するすべての投稿を取得することだけです。 dbForum.Posts.Include(t => t.Thread).GroupBy(t => t.Slug == threadSlug)しかし、私はこれをフェッチする方法を知らない... – daniyel

関連する問題