文章内容
2016/12/15 14:22:50,作 者: 黄兵
Entity Framework数据库初始化策略
数据库创建是由策略来控制的,有如下四种策略:
1. CreateDatabaseIfNotExists:这是默认的策略。如果数据库不存在,那么就创建数据库。但是如果数据库存在了,而且实体发生了变化,就会出现异常。
2. DropCreateDatabaseIfModelChanges:此策略表明,如果模型变化了,数据库就会被重新创建,原来的数据库被删除掉了。
3. DropCreateDatabaseAlways:此策略表示,每次运行程序都会重新创建数据库,这在开发和调试的时候非常有用。
4. 自定制数据库策略:可以自己实现IDatabaseInitializer来创建自己的策略。或者从已有的实现了IDatabaseInitializer接口的类派生。
如下示例显示了如何应用数据库创建策略:
public class UserManContext : DbContext
{
public UserManContext()
: base("USMDBConnectionString")
{
Database.SetInitializer<UserManContext>(new CreateDatabaseIfNotExists<UserManContext>());
}
}
下面的代码创建了一个自定义策略,什么也没有做,但是我们可以在Seed方法里添加我们的种子数据。
public class USMDBInitializer : DropCreateDatabaseAlways<UserManContext>
{
protected override void Seed(UserManContext context)
{
base.Seed(context);
}
}
虽然EF提供了在配置文件中配置策略的方法,如下所示:
<appSettings>
<addkey="DatabaseInitializerForType EFCodeFirstSample.UserManContext, EFCodeFirstSample"
value="System.Data.Entity.DropCreateDatabaseAlways`1[[EFCodeFirstSample.UserManContext,EFCodeFirstSample]], EntityFramework" />
</appSettings>
Key必须以DatabaseInitializerForType开始,后边加空格,之后是context类的全名称,包括带命名空间的类名和所在的程序集名。Value是策略的全名称。可以看见key和value都非常难读,还不如自己写配置来的好。
如果不想使用策略,就可以关闭策略,特别是默认策略。关闭策略的代码如下:
public class UserManContext : DbContext
{
public UserManContext()
: base("USMDBConnectionString")
{
Database.SetInitializer<UserManContext>(null);
}
}
还可以在配置文件中关闭策略,如下:
<addkey="DatabaseInitializerForTypeEFCodeFirstSample.UserManContext, EFCodeFirstSample"
value="Disabled" />
为数据库添加种子数据
上面提高可以在自定义数据库初始化策略中添加种子数据,下面的示例说明如何添加种子数据:
public class USMDBInitializer : DropCreateDatabaseAlways<UserManContext>
{
protected override void Seed(UserManContext context)
{
User admin = new User();
admin.Name = "admin";
admin.DisplayName = "Administrator";
admin.Status = 1;
admin.LastModDate= DateTime.Now;
context.Users.Add(admin);
base.Seed(context);
}
}
需要注意的是日期字段,数据库中的日期范围小于.NET中的日期范围,所以必须给一个合适的值,像DateTime.MinValue这样的值无法存储到数据库中。可以参考SqlDateTime类型来确定Sql数据库支持的时间范围。
评论列表