0

Я использую enitity framework version 6.1.0 code first approch. База данных только создает тонкую, но когда она придет к посевной части, она не высевает переопределяющий метод семени.Database.SetInitializer не посещает базу данных?

Как сделать, чтобы засеять мои данные?

Моя реализация тестирования в

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); 
    } 
} 
+0

вы пробовали 'Database.SetInitializer (новый Wb1.Model.ProductsDatabaseInitializer());?' – tschmit007

+0

да я попробовал в Application_Start так –

+0

, вам нужно это с помощью (вар DbContext = новый WB1 .Model.ETestContext()) { if (! DbContext.Database.Exists()) { dbContext.Database.Create(); } dbContext.Database.Initialize (true); }, я думал, что структура EF будет обрабатывать это для вас. –

ответ

1

Вы должны позвонить Initialize вместо Create, он имеет различную реализацию с инициализатором.

Создает новую базу данных на сервере базы данных для модели, определенной в контексте поддержки. Обратите внимание, что вызов этого метода перед запуском стратегии инициализации базы данных отключит выполнение этой стратегии. - MSDN

И поскольку ProductsDatabaseInitializer является DropCreateDatabaseIfModelChanges, момент, когда вы звоните Initialize, база данных была создана таким образом, что метод Seed не будет выполнен, но если есть изменение модели, метод Seed будет выполнен, потому что он упал и воссоздан.

Правильный путь должен быть просто вызывающей Initialize без проверки, если она существует, или нет, потому что это уже происходит от DropCreateDatabaseIfModelChanges, что означает создание, если она не существует и выполнить метод Seed, или падение и создавать, если модель изменился и выполните метод Seed, иначе ничего не сделайте.

Database.SetInitializer(new Wb1.Model.ProductsDatabaseInitializer()); 
using (var dbContext = new Wb1.Model.ETestContext()) 
{ 
    dbContext.Database.Initialize(true); 
} 
+0

@ HassaanKhan, это решило проблему? –