Я использую 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);
}
}
вы пробовали 'Database.SetInitializer (новый Wb1.Model.ProductsDatabaseInitializer());?' –
tschmit007
да я попробовал в Application_Start так –
, вам нужно это с помощью (вар DbContext = новый WB1 .Model.ETestContext()) { if (! DbContext.Database.Exists()) { dbContext.Database.Create(); } dbContext.Database.Initialize (true); }, я думал, что структура EF будет обрабатывать это для вас. –