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

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

  • 相关阅读:
    python高级函数六剑客
    测试工程师用到常用的git命令
    qing理解赋值,深浅拷贝的区别
    python设计模式之单例
    Python全栈之jQuery笔记
    畅谈python之单元测试框架-unittest
    浅析python之单元测试框架-unittest
    Python之日志处理(logging模块)
    Spring整理
    Spark学习笔记11面向对象编程
  • 原文地址:https://www.cnblogs.com/talentzemin/p/7307981.html
Copyright © 2020-2023  润新知