【译】第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>

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

时间: 2024-11-08 23:21:12

【译】第31节---数据库初始化策略的相关文章

Code-First 数据库初始化策略

原文:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-first.aspx 有四种不同的数据库初始化策略: CreateDatabaseIfNotExists:这是默认的初始值设定项.顾名思义,如果每个配置都不存在,它将创建数据库.但是,如果更改模型类,然后使用此初始化程序运行应用程序,则会引发异常. DropCreateDatabaseIfModelChange

EF CodeFirst简介、默认约定、数据库初始化策略

CodeFirst 工作流程 创建或修改领域类-->使用数据注解或者Fluent API来配置领域类-->使用自动数据库迁移技术或者基于代码的数据库迁移技术来创建数据库. CodeFirst默认约定 约定就是一系列的默认规则,通过这些规则,在使用EF Code-First的时候,可以自动的基于你的领域类配置概念模型.默认约定的命名空间:System.Data.Entity.ModelConfiguration.Conventions; ①schema(模式)  默认情况下,EF会为所有的数据库

DB Initialization(数据库初始化)[EF Code-First系列]

前面的例子中,我们已经看到了Code-First自动为我们创建数据库的例子. 这里我们将要学习的是,当初始化的时候,Code-First是怎么决定数据库的名字和服务的呢??? 下面的图,解释了这一切!!! 这个图解释了,数据库初始化的流程,是基于我们在上下文类中的构造函数中传递的参数. 在上面的图中,context类中的base构造器中,可以填入下面的参数: 无参数(No Parameter) 数据库的名字(Database Name) 连接字符串的名字(Connection String Na

Entity Framework数据库初始化四种策略

策略一:数据库不存在时重新创建数据库 复制内容到剪贴板 程序代码 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testContext>()); 策略二:每次启动应用程序时创建数据库 复制内容到剪贴板 程序代码 Database.SetInitializer<testContext>(new DropCreateDatabaseAlways<testContext>())

Entity Framework 数据库初始化四种策略

策略一:数据库不存在时重新创建数据库 1 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testContext>()); 策略二:每次启动应用程序时创建数据库 1 Database.SetInitializer<testContext>(new DropCreateDatabaseAlways<testContext>()); 策略三:模型更改时重新创建数据库 1 Dat

EF 创建数据库的策略 codefist加快效率!【not oringin!】

今天去搜寻,ef创建数据库的策略有四种,区分还是和数据库里sql的创建的语句这些英文差不多一致. 一:数据库不存在时重新创建数据库 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExists<testContext>()); 策略二:每次启动应用程序时创建数据库 Database.SetInitializer<testContext>(new DropCreateDatabaseAlways<

SQL Server 数据库初始化准备脚本

通常我们在项目部署前都会写一份数据库初始化脚本.由于数据库外键的限制,我们需要按照数据引用顺序添加初始记录,这个整理过程相当麻烦. 因此写了以下脚本,原理是先去掉所有外键,然后执行一次清空,然后添加数据,最后恢复外键. 网上也有暂时禁用外键添加数据的方法,但由于SQL Server在有外键的情况下,不能使用TRUNCATE TABLE语句,因此暂时禁用外键时,只能使用DELETE语句清除无用数据.如果觉得删除外键不安全,也可以考虑将以下脚本修改为禁用外键的方式运行. 脚本在 SQL Server

EntityFramework Code-First 简易教程(三)-------数据库初始化

现在我们来学习,当数据库初始化的时候,Code First怎样设置数据库的名字. 下面的图显示了数据库初始化的工作流程,根据传入给context基类的构造函数的参数来初始化: 根据上面的图,context基类的构造函数可以传入如下参数: 无参数 参数为数据库名称 参数为连接字符串 无参数的构造函数: 如果不传参数给context基类的构造函数,它就会在我们本地创建一个以{命名空间}.{Context类名}为名字的数据库.比如下面代码会创建一个名字为SchoolDataLayer.Context的

基于Extjs的web表单设计器 第五节——数据库设计

这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extjs的web表单设计器 第四节——控件拖放 基于Extjs的web表单设计器 第五节——数据库设计 基于Extjs的web表单设计器 第六节——界面框架设计