我正在使用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);
}
}
答案 0 :(得分:1)
您应该拨打Initialize
而不是Create
,它与初始化程序的实现方式不同。
在数据库服务器上为其中定义的模型创建新数据库 支持背景。请注意,在数据库之前调用此方法 初始化策略已运行将禁用执行该策略。 - MSDN
由于ProductsDatabaseInitializer
是DropCreateDatabaseIfModelChanges
,所以在您调用Initialize
的那一刻,数据库已经创建,以便Seed
方法不会被执行,但是如果有的话一个模型更改,Seed
方法将被执行,因为它被删除并重新创建。
正确的方法应该是调用Initialize
而不检查它是否存在,因为它已经从DropCreateDatabaseIfModelChanges
派生,这意味着如果它不存在则创建并执行{{1方法,或者删除并创建模型是否已更改并执行Seed
方法,否则不执行任何操作。
Seed