使用样本数据为Entity Framework的种子数据库不会创建数据库

时间:2011-11-29 16:00:54

标签: asp.net-mvc-3 entity-framework

我很擅长使用Entity Framework,以及使用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));
        }
    }
}

这几乎就是一切。我确实删除了一次数据库文件。在构建解决方案时,它不应该再次创建吗?

3 个答案:

答案 0 :(得分:5)

原因:这是因为您使用的是“ DropCreateDatabaseIfModelChanges ”。

因为它表明你的模型没有改变,所以它不会创建数据库(或者如果数据库已经存在,那么它就不会添加你的填充数据)。

解决方案:您希望改为使用“ CreateDatabaseIfNotExists ”。

备选方案:如果您已经创建了数据库并且您只想添加初始数据,那么请使用“ DropCreateDatabaseAlways ”但是您必须意识到这将重新创建数据库每次应用程序重新启动时都会刮擦。因此,只有在您的数据库已经创建并且您不想更改模型时(并且您不关心丢失数据库中已存在的数据)才使用此项,然后将其更改为其他两个选项之一。

答案 1 :(得分:2)

我看到你正在将你的对象添加到你的实体,但你是否正在调用context.SaveChanges()来提交给db?

找到了可能有用的链接:EF4 Code First CTP5: Seed method no longer works

答案 2 :(得分:0)

显然,在浏览器中刷新页面之前,不会重新创建数据库。我不断重新构建解决方案,但没有刷新页面。