Database.SetInitializer没有播种数据库?

时间:2014-09-14 13:21:52

标签: c# entity-framework ef-code-first linq-to-entities code-first

我正在使用enitity framework version 6.1.0 code first approch。数据库只是创建正常,但是当播种部分没有播种覆盖种子方法时。

如何制作我的数据?

我的测试实现是

public class Products
{
    public Products()
    {
        this.Categories = new HashSet<Categories>();
    }

    [ScaffoldColumn(false)]
    [Key()]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ProductId { get; set; }

    [Required,StringLength(100),Display(Name="Product Name")]
    public string Name { get; set; }

    public int? CategoryId { get; set; }
    public virtual ICollection<Categories>  Categories{ get; set; }
}

public class Categories
{
    [ScaffoldColumn(false)]
    [Key()]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CategoryId { get; set; }

    [Required,StringLength(100),Display(Name="Category")]
    public string Name { get; set; }
    public virtual ICollection<Products> Products { get; set; }

}

ProductsInitializer继承自DropIfModelchanges

 public class ProductsDatabaseInitializer : DropCreateDatabaseIfModelChanges<ETestContext>
 {
    protected override void Seed(ETestContext context)
    {
        GetCategories().ForEach(c => context.Categories.Add(c));
        GetProducts().ForEach(p => context.Products.Add(p));
        context.SaveChanges();

        base.Seed(context);
    }

    private static List<Categories> GetCategories()
    {
        var categories = new List<Categories>{
            new Categories{
                CategoryId=101,
                Name="Electronics"
            },
            new Categories{
                CategoryId=102,
                Name="Clothing"
            }
        };
        return categories;
    }

    private static List<Products> GetProducts()
    {
        var products = new List<Products>{
           new Products{
             CategoryId = 101,
             ProductId=1,
             Name="Laptops"
           },
           new Products{
             CategoryId = 101,
             ProductId=2,
             Name="Desktops"
           },
           new Products{
             CategoryId = 102,
             ProductId=3,
             Name="Male Clothing"
           },
           new Products{
             CategoryId = 102,
             ProductId=4,
             Name="Female Clothing"
           }
       };
        return products;
    }


}

我的DBcontext类是

public class ETestContext : DbContext
{

    public ETestContext()
        : base("ETest")
    {

    }

    public DbSet<Categories> Categories { get; set; }
    public DbSet<Products> Products { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Categories>().HasMany<Products>(c => c.Products).WithMany(p => p.Categories)
            .Map(c =>
            {
                c.MapLeftKey("CategoryId");
                c.MapRightKey("ProductId");
                c.ToTable("CategoryProduct");
            });
        base.OnModelCreating(modelBuilder);
    }
}

在global.asax中,我正在实现

protected void Application_Start(object sender, EventArgs e)
{
   Database.SetInitializer(new Wb1.Model.ProductsDatabaseInitializer());
   using (var dbContext = new Wb1.Model.ETestContext())
   {
     if (!dbContext.Database.Exists())
     {
       dbContext.Database.Create();
     }
     dbContext.Database.Initialize(true);
   }
}

1 个答案:

答案 0 :(得分:1)

您应该拨打Initialize而不是Create,它与初始化程序的实现方式不同。

  

在数据库服务器上为其中定义的模型创建新数据库   支持背景。请注意,在数据库之前调用此方法   初始化策略已运行将禁用执行该策略。 - MSDN

由于ProductsDatabaseInitializerDropCreateDatabaseIfModelChanges,所以在您调用Initialize的那一刻,数据库已经创建,以便Seed方法不会被执行,但是如果有的话一个模型更改,Seed方法将被执行,因为它被删除并重新创建。

正确的方法应该是调用Initialize而不检查它是否存在,因为它已经从DropCreateDatabaseIfModelChanges派生,这意味着如果它不存在则创建并执行{{1方法,或者删除并创建模型是否已更改并执行Seed方法,否则不执行任何操作。

Seed