• EntityFramework :数据库创建


    控制数据库的位置

    默认情况下,数据库是创建在localhostSQLEXPRESS服务器上,并且默认的数据库名为命名空间+context类名,例如我们前面的BreakAway.BreakAwayContext。

    有几种方法可以改变这种默认约定。

    利用配置文件

    在配置文件中新加一个连接字符串

      <connectionStrings>
        <add name="BreakAwayContext" providerName="System.Data.SqlClient" connectionString="Server=.SQLEXPRESS;Database=BreakAwayConfigFile;Trusted_Connection=true" />
      </connectionStrings>

    注意这里连接字符串名称和我们的context类名相同,都为BreakAwayContext。我们修改了一下默认的数据库名,将BreakAway.BreakAwayContext

    改为BreakAwayConfigFile。

    我们在新增一个连接字符串

    <connectionStrings>
        <!--<add name="BreakAwayContext" providerName="System.Data.SqlClient" connectionString="Server=.SQLEXPRESS;Database=BreakAwayConfigFile;Trusted_Connection=true" />-->
        <add name="My_Test" providerName="System.Data.SqlClient" connectionString="Server=.;Database=MyBreakAwayDb;Trusted_Connection=true" />
      </connectionStrings>

    新建的连接串名称和context类名不同了,所以我们要在BreakAwayContext的构造函数中指名连接串的名称:

    复制代码
     public class BreakAwayContext : DbContext
        {
            public BreakAwayContext():
                base("name=My_Test")
            {
            }
        } 
    复制代码

    利用DbConnection

    DbContext有一个带DbConnection重载的构造函数,说明我们也可以通过DbConnection来定位数据库位置。我们也要先修改BreakAwayContext的构造函数:

             public BreakAwayContext(DbConnection connection)
                : base(connection, contextOwnsConnection: false)
            { }

    调用:

    复制代码
            static void Main(string[] args)
            {
                try
                {
                    var lodging = new Lodging
                    {
                        Name = "Rainy Day Motel",
                    };
    
                    var resort = new Resort
                    {
                        Name = "Top Notch Resort and Spa",
                        MilesFromNearestAirport = 30,
                        Activities = "Spa, Hiking, Skiing, Ballooning",
                    };
    
                    var cstr = @"Server=.SQLEXPRESS; Database=BreakAwayDbConnectionConstructor;Trusted_Connection=true";
                    using (var connection = new SqlConnection(cstr))
                    {
                        using (var context = new BreakAwayContext(connection))
                        {
                            context.Lodgings.Add(lodging);
                            context.SaveChanges();
                        }
                    }
                }
                catch (System.Data.Entity.Validation.DbEntityValidationException ex)
                {
                    Console.WriteLine( " 保存失败");
                }
                Console.WriteLine("OK");
                Console.Read();
            }
    复制代码

    使用连接工厂控制数据库位置

    Code First的默认连接工厂是SqlConnectionFactory。此连接工厂将使用SQL Client(System.Data.SqlClient的)数据库引擎连接到数据库。默认的行为,将选择在localhost SQLEXPRESS创建数据库,并使用上下文类型的完全限定名作为数据库的名称。
    我们可以通过指定的连接字符串段,来覆写默认规则。

    复制代码
     static void Main(string[] args)
            {
                try
                {
                    Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Server=.;Trusted_Connection=true");
                    using (var context = new BreakAwayContext())
                    {
                        context.Database.Initialize(true);
                        context.SaveChanges();
                    }
                }
                catch (System.Data.Entity.Validation.DbEntityValidationException ex)
                {              
                    Console.WriteLine( " 保存失败");
                }
                Console.WriteLine("OK");
                Console.Read();
            }
    复制代码

    PS:用这个方法好像没办法指定数据库名,默认名称为context类的完全限定名。

    数据库初始化

    初始化包括两个主要步骤。首先,使用Code First在内存中根据默认规则和配置创建模型。其次,使用已设置的数据库初始化器将用于存储数据的数据库初始化。

    初始化是延迟加载的,所以创建一个实例的是不完全满足初始化发生的条件的。必须执行对模型的操作,如查询或添加实体才会发生。

    但我们可以可以调用DbContext.Database.Initialize方法,在没有对模型执行任何操作的时候强制初始化。

                 using (var context = new BreakAwayContext())
                    {
                        context.Database.Initialize(true);
                    }

    在数据库初始化产生时进行控制

    有三个方法可以控制数据库初始化时的行为。

    1 CreateDatabaseIfNotExists

    CreateDatabaseIfNotExists方法会在没有数据库时创建一个,这是默认行为。

                    Database.SetInitializer( 
                        new CreateDatabaseIfNotExists<BreakAwayContext>());
                    using (var context = new BreakAwayContext())
                    {
                        context.Database.Initialize(true);
                    }

    2 DropCreateDatabaseIfModelChanges

    如果我们在在模型改变时,自动重新创建一个新的数据库,就可以用这个方法。在这开发过程中非常有用。

                    Database.SetInitializer(
                        new DropCreateDatabaseIfModelChanges<BreakAwayContext>());
                    using (var context = new BreakAwayContext())
                    {
                        context.Database.Initialize(true);
                    }

    3 DropCreateDatabaseAlways

    如果你想在每次运行时都重新生成数据库就可以用这个方法。

                    Database.SetInitializer(
                        new DropCreateDatabaseAlways<BreakAwayContext>());
                    using (var context = new BreakAwayContext())
                    {
                        context.Database.Initialize(true);
                    }
  • 相关阅读:
    利用Continuous Testing实现Eclipse环境自动单元测试
    GWT-Dev-Plugin(即google web toolkit developer plugin)for Chrome的安装方法
    在SQL Server 2012中实现CDC for Oracle
    在SSIS 2012中使用CDC(数据变更捕获)
    SQL Server Data Tools – Business Intelligence for Visual Studio 2012安装时提示“The CPU architecture....”的解决方法
    SQL Server 2012新特性(1)T-SQL操作FileTable目录实例
    RHEL每天定时备份Oracle
    GWT-Dev-Plugin(即google web toolkit developer plugin)for firefox的下载地址
    Oracle中修改表名遇到“ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”
    Oracle中序列(SEQUENCE)的使用一例
  • 原文地址:https://www.cnblogs.com/answercard/p/5212491.html
Copyright © 2020-2023  润新知