如何确定我的EF 6数据库初始化程序是否运行?

时间:2015-06-24 12:28:55

标签: c# entity-framework entity-framework-6

我想知道我的set数据库初始化程序是否会运行。我按如下方式设置了数据库初始化程序:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    static ApplicationDbContext()
    {
        // Set the database intializer which is run once during application start
        // This seeds the database with admin user credentials and admin role
        Database.SetInitializer(new ApplicationDbInitializer());
    }

这是我想知道的:

    public ApplicationDbContext()
        : base("DefaultConnection", false)
    {
        // Here I would like to know if the initializer will run or not.
    }

1 个答案:

答案 0 :(得分:0)

首先,默认情况下有三种数据库初始化策略,它们是:

CreateDatabaseIfNotExists:默认初始值设定项。如果根据配置不存在,它将创建数据库。请记住,如果更改模型类,然后使用此初始化程序运行应用程序,则会抛出异常。

DropCreateDatabaseIfModelChanges:如果您的模型类已更改,此初始化程序将删除现有数据库并创建新数据库。因此,当模型类发生变化时,您不必担心维护数据库模式。

DropCreateDatabaseAlways:顾名思义,无论您的模型类是否已更改,此初始化程序每次运行应用程序时都会删除现有数据库。

所有这些都继承自 IDatabaseInitializer

现在,您可以扩展数据库初始化程序以执行更多操作,例如在您的情况下,获得通知。

要做到这一点,你需要在 web.config 中设置它并创建一个自定义初始化程序,然后覆盖将在每个实例中调用的种子方法。此方法可以通知您的应用程序。

请记住,我在这里覆盖 DropCreateDatabaseIfModelChanges 因为我打算保持行为,你可以扩展 IDatabaseInitializer 并覆盖他的 InitializeDatabase 方法,如果你想要自己的行为。

这里有一个示例代码:

class ContextInitializer : DropCreateDatabaseIfModelChanges<Dbc>
{
    protected override void Seed(Dbc context)
    {
        // Here you can notify you before any change got executed
        InitializeDatabase(context);
    }
}

这是web.config内容:

<!--Context.Dbc is the namespace qualified class of my context. Context is the DLL that it is found in.-->
<!--Context.ContextInitalizer is the namespace qualified class of my custom initializer. Context is the DLL that it is found in.-->
<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <!-- This specifies that EF has an initializer -->
    <contexts>
      <context type="Context.Dbc, Context">
        <databaseInitializer type="Context.ContextInitializer, Context"></databaseInitializer>
      </context>
    </contexts>
    <!--End initializer-->
</entityFramework>

示例代码:http://brandonclapp.com/entity-framework-custom-database-initializer-from-web-config/