2011-09-30 67 views
6

我使用实体框架代码优先与MySQL数据源。实体框架在重建时插入初始数据

我定义ContactType.cs如下:

public class ContactType 
{ 
    [Key] 
    public int ContactTypeId { get; set; } 

    [Required, StringLength(30)] 
    public string DisplayName { get; set; } 
} 

我的问题是,我重建数据库后,我怎么能有EF插入(不包括SQL)某些类型的接触到数据库中。通常情况下,数据库被重建为空白模式,但我想添加类似(家庭,移动,办公室,传真)的联系人类型。

回答

15

您创建一个自定义数据库初始化,并覆盖Seed方法

public class MyContextInitializer 
    : DropCreateDatabaseIfModelChanges<MyContext> 
{ 
    protected override void Seed(MyContext context) 
    { 
     context.ContactTypes.Add(new ContactType { DisplayName = "Home" }); 
     context.ContactTypes.Add(new ContactType { DisplayName = "Mobile" }); 
     context.ContactTypes.Add(new ContactType { DisplayName = "Office" }); 
     context.ContactTypes.Add(new ContactType { DisplayName = "Fax" }); 

     //EF will call SaveChanges itself 
    } 
} 

然后你注册这个初始化为您导出的上下文MyContext

Database.SetInitializer<MyContext>(new MyContextInitializer()); 

这是Database类的静态方法应该在应用程序启动时调用一次。你也可以把它放到你的上下文的静态构造函数,以确保您创建的第一个上下文实例之前初始化器设置:

static MyContext() 
{ 
    Database.SetInitializer<MyContext>(new MyContextInitializer()); 
} 

不是基初始化DropCreateDatabaseIfModelChanges<T>您也可以从DropCreateDatabaseAlways<T>CreateDatabaseIfNotExists<T>,如果得到的更好地满足您的需求。