文章内容

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数据库支持的时间范围。

分享到:

发表评论

评论列表