译第31节---数据库初始化策略

Posted talentzemin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了译第31节---数据库初始化策略相关的知识,希望对你有一定的参考价值。

原文:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-first.aspx

在第一次运行Code-First应用程序后已经创建了一个数据库,但是第二次启动时呢?每次运行应用程序时会创建一个新的数据库吗?生产环境怎么样?更改域模型时,如何更改数据库?要处理这些情况,必须使用一个数据库初始化策略。

 

有四种不同的数据库初始化策略:

CreateDatabaseIfNotExists:这是默认的初始化程序。顾名思义,如果没有配置,它将创建数据库。但是,如果更改模型类,然后使用该初始化程序运行应用程序,那么它将抛出异常。
DropCreateDatabaseIfModelChanges:如果你的模型类(实体类)已更改,则此初始化程序将删除现有数据库并创建新数据库。因此,当你的模型类更改时,无需担心维护数据库模式。
DropCreateDatabaseAlways:顾名思义,该初始化程序在每次运行应用程序时都会删除现有数据库,而不管模型类是否已更改。当你需要最新数据库时,每次运行应用程序时,就像新开发应用程序一样。
Custom DB Initializer:你还可以创建自己的自定义初始化程序,如果上述任何一个不满足要求,或者你想使用上述初始化程序初始化数据库的其他方法。


要使用上述数据库初始化策略之一,必须在Context类中使用Database类设置DB Initializer,如下所示:

public class SchoolDBContext: DbContext 
{
        
    public SchoolDBContext(): base("SchoolDBConnectionString") 
    {
        Database.SetInitializer<SchoolDBContext>(new CreateDatabaseIfNotExists<SchoolDBContext>());

        //Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseIfModelChanges<SchoolDBContext>());
        //Database.SetInitializer<SchoolDBContext>(new DropCreateDatabaseAlways<SchoolDBContext>());
        //Database.SetInitializer<SchoolDBContext>(new SchoolDBInitializer());
    }
    public DbSet<Student> Students { get; set; }
    public DbSet<Standard> Standards { get; set; }
}

你也可以通过继承其中一个初始值设置来创建自定义DB初始值设置,如下所示:

public class SchoolDBInitializer :  CreateDatabaseIfNotExists<SchoolDBContext>
{
    protected override void Seed(SchoolDBContext context)
    {
        base.Seed(context);
    }
}

如上面代码所示,我们创建了一个新的SchoolDBInitializer类,它由CreateDatabaseIfNotExists初始化器派生。

在配置文件中设置db initializer:
你也可以在配置文件中设置db initializer。 例如,要在app.config中设置默认的初始化程序:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
    <add key="DatabaseInitializerForType SchoolDataLayer.SchoolDBContext, SchoolDataLayer"         
        value="System.Data.Entity.DropCreateDatabaseAlways`1[[SchoolDataLayer.SchoolDBContext, SchoolDataLayer]], EntityFramework" />
    </appSettings>
</configuration>

你可以设置自定义DB初始化程序,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>    
    <add key="DatabaseInitializerForType SchoolDataLayer.SchoolDBContext, SchoolDataLayer"
            value="SchoolDataLayer.SchoolDBInitializer, SchoolDataLayer" />
    </appSettings>
</configuration>

这样,你就可以为应用程序使用数据库初始化策略。

 

以上是关于译第31节---数据库初始化策略的主要内容,如果未能解决你的问题,请参考以下文章

译第36节---基于代码迁移

译第17节---数据注解-Column

译第40节---EF6-命令监听

译第2节--- 什么是Code First?

译第4节---简单的Code First示例

译第3节--- 配置开发环境