2011-11-29 37 views
2

我是使用實體框架以及使用ASP.NET MVC的新手。我已經能夠在ASP.NET MVC網站上完成一些教程,並認爲我將基於MVC音樂商店應用程序開始我自己的項目。使用示例數據爲實體框架種子數據庫不會創建數據庫

我不能告訴我出錯的地方(它對我來說看起來都一樣),但出於某種原因,我的種子數據不會創建數據庫。

項目類:

namespace MySite.Models 
{ 
    public class Item 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 

標籤類:

namespace MySite.Models 
{ 
    public class Tag 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 

ItemTag類:

namespace MySite.Models 
{ 
    public class ItemTag 
    { 
     public int Id { get; set; } 
     public int ItemId { get; set; } 
     public int TagId { get; set; } 
    } 
} 

MySiteEntities類:

namespace MySite.Models 
{ 
    public class MySiteEntities : DbContext 
    { 
     public DbSet<Item> Items { get; set; } 
     public DbSet<Tag> Tags { get; set; } 
     public DbSet<ItemTag> ItemTags { get; set; } 
    } 
} 

的Global.asax類:

namespace MySite 
{ 
    public class MvcApplication : System.Web.HttpApplication 
    { 
     ... 

     protected void Application_Start() 
     { 
      System.Data.Entity.Database.SetInitializer(new MySite.Models.SampleData()); 

      AreaRegistration.RegisterAllAreas(); 

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

Web.config文件:

<configuration> 
    ... 

    <connectionStrings> 
    <add name="MySiteEntities" 
     connectionString="Data Source=|DataDirectory|MySite.sdf" 
     providerName="System.Data.SqlServerCe.4.0" /> 
    </connectionStrings> 
</configuration> 

的sampleData類:

namespace MySite.Models 
{ 
    public class SampleData : DropCreateDatabaseIfModelChanges<MySiteEntities> 
    { 
     protected override void Seed(MySiteEntities context) 
     { 
      new List<Item> 
      { 
       new Item { Id = 1, Name = "Bob Jones" }, 
       new Item { Id = 2, Name = "George Smith" }, 
       new Item { Id = 3, Name = "Boys and Girls" }, 
       new Item { Id = 4, Name = "The President's Hair" }, 
       new Item { Id = 5, Name = "Invaders From Mars" }, 
       new Item { Id = 6, Name = "Tank Shooter" }, 
       new Item { Id = 7, Name = "Stew's Blog" }, 
       new Item { Id = 8, Name = "Social Mania" } 
      }.ForEach(i => context.Items.Add(i)); 

      new List<Tag> 
      { 
       new Tag { Id = 1, Name = "Author" }, 
       new Tag { Id = 2, Name = "Movie" }, 
       new Tag { Id = 3, Name = "Video Game" }, 
       new Tag { Id = 4, Name = "Website" } 
      }.ForEach(t => context.Tags.Add(t)); 

      new List<ItemTag> 
      { 
       new ItemTag { Id = 1, ItemId = 1, TagId = 1 }, 
       new ItemTag { Id = 2, ItemId = 2, TagId = 1 }, 
       new ItemTag { Id = 3, ItemId = 3, TagId = 2 }, 
       new ItemTag { Id = 4, ItemId = 4, TagId = 2 }, 
       new ItemTag { Id = 5, ItemId = 5, TagId = 3 }, 
       new ItemTag { Id = 6, ItemId = 6, TagId = 3 }, 
       new ItemTag { Id = 7, ItemId = 7, TagId = 4 }, 
       new ItemTag { Id = 8, ItemId = 8, TagId = 4 } 
      }.ForEach(x => context.ItemTags.Add(x)); 
     } 
    } 
} 

這幾乎是一切。我確實在一點上刪除了數據庫文件。當我構建解決方案時不應該再次創建它嗎?

回答

5

原因:這是因爲您正在使用 「DropCreateDatabaseIfModelChanges」。

因爲它表明如果你的模型沒有改變,那麼它不會創建數據庫(或者如果數據庫已經存在,那麼它不會添加你填充的數據)。

解決方案:您想改爲使用「CreateDatabaseIfNotExists」。

替代:如果你DB已經創建,你只是想添加初始數據,然後使用「DropCreateDatabaseAlways」不過你必須意識到這將從頭開始,每次重新創建數據庫的應用程序重新啓動。因此,只有在您的數據庫已經創建並且您不想更改模型(並且您不關心丟失數據庫中已有的數據)並將其更改爲另外兩個選項之一時才使用它。

+0

有趣。這是有道理的,但它是否仍然等待頁面在瀏覽器中刷新以創建數據庫?我顯然對這種行爲感到困惑。 –

+0

正確。在調用使用您的DbContext的操作方法之前,數據庫不會被更改。在你的例子中,一個具有以下「var allItems = mySiteEntities.Item.ToList();返回View(allItems);」的動作方法「然後在您的瀏覽器中查看將重新創建數據庫 – MVCKarl

2

我看到你正在添加你的對象到你的實體,但你調用context.SaveChanges()來提交然後到數據庫?

找到了一個鏈接,可以幫助:EF4 Code First CTP5: Seed method no longer works

+0

在Seed()方法結尾處添加context.SaveChanges()不執行任何操作D: –

+2

'context。SaveChanges()'在調用Seed()方法後由'DropCreateDatabaseIfModelChanges'調用,因此你不需要自己調用它。 – okrumnow

0

顯然,數據庫不會被重新創建,直到頁面在瀏覽器中刷新。我不斷重新構建解決方案,但並未刷新頁面。

相關問題