2012-02-14 64 views
0

我在更改/更新模型後遇到了重建數據庫的問題。我有一個數據庫文件「帖子」,「線程」和「關係」內的三個表。如果我運行應用程序併發布新線程一切都很好,我可以看到線程。如果我嘗試在線程中添加帖子,它會拋出一個錯誤,說它無法按名稱「線程」查找表。如果我在Visual Web Developer中檢查「數據庫資源管理器」,我只能看到表格「Posts」,這很尷尬。現在我讀了一些地方,直到首次使用model(save?)才創建db。SQL CE 4.0和ASP.NET MVC中的應用程序錯誤3

我的模式設置爲:

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

我也用 「DropCreateDatabaseAlways」 導致同樣的錯誤。帖子模型與Thread相同,其中有相關的字段「text」和Posts名稱。

關係模型:

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

您應該將所有三個DbSets添加到相同的DbContext。現在我再次讀到您的問題,我發現Relations實際上是PostThread之間的多對一關係。這門課可以省略。

這可能是你的新的解決方案:

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 2012-02-14 11:10:48

+0

它應該是一個單獨的課程。我會更新我的答案來證明這一點。 – 2012-02-14 11:16:39

+0

我現在工作了。謝謝你的幫助。現在唯一剩下的就是獲取與線程ID或Slug相關的所有帖子。我得到它是這樣的:dbForum.Posts.Include(t => t.Thread).GroupBy(t => t.Slug == threadSlug),但我不知道如何獲取此... – daniyel 2012-02-14 12:47:05