2012-02-14 69 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

相关问题