zoukankan      html  css  js  c++  java
  • 【译】第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>

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

  • 相关阅读:
    OnEraseBkgnd、OnPaint与画面重绘
    .编译ADO类DLL时报错的解决方案
    VC列表框样式
    Codeforces 131D. Subway 寻找环树的最短路径
    Codeforces 103B. Cthulhu 寻找奈亚子
    Codeforces 246D. Colorful Graph
    Codeforces 278C. Learning Languages 图的遍历
    Codeforces 217A. Ice Skating 搜索
    Codeforces 107A. Dorm Water Supply 搜图
    Codeforces 263 D. Cycle in Graph 环
  • 原文地址:https://www.cnblogs.com/talentzemin/p/7307981.html
Copyright © 2011-2022 走看看