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

Dav*_*edy 2 entity-framework asp.net-mvc-3

我很擅长使用Entity Framework,以及使用ASP.NET MVC.我已经能够在ASP.NET MVC网站上完成几个教程,并认为我将基于MVC Music Store应用程序启动我自己的项目.

我不知道我哪里出错了(这对我看起来都一样),但由于某种原因,我的种子数据并没有创建数据库.

物品类:

namespace MySite.Models
{
    public class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

标签类:

namespace MySite.Models
{
    public class Tag
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

ItemTag类:

namespace MySite.Models
{
    public class ItemTag
    {
        public int Id { get; set; }
        public int ItemId { get; set; }
        public int TagId { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Web.config文件:

<configuration>
  ...

  <connectionStrings>
    <add name="MySiteEntities"
      connectionString="Data Source=|DataDirectory|MySite.sdf"
      providerName="System.Data.SqlServerCe.4.0" />
  </connectionStrings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

MVC*_*arl 5

原因:这是因为您使用的是" DropCreateDatabaseIfModelChanges ".

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

解决方案:您想要使用" CreateDatabaseIfNotExists ".

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