我想知道我的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.
}
答案 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/