您的位置:首页 > 数据库

EF Code First学习笔记:数据库创建(转载修改)

2015-08-15 22:18 591 查看
自定义数据库链接字符串

控制数据库的位置

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

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

利用配置文件

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







备注

[code]使用本例中的connectionString连接失败,具体的字符串可以通过如下方式获得:项目右键->添加->新建项![这里写图片描述](http://img.blog.csdn.net/20150815213213853)
![这里写图片描述](http://img.blog.csdn.net/20150815213343078)
![这里写图片描述](http://img.blog.csdn.net/20150815213416777)
![这里写图片描述](http://img.blog.csdn.net/20150815221522846)
![这里写图片描述](http://img.blog.csdn.net/20150815221702811)


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

改为BreakAwayConfigFile。

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









具体的连接字符串请按上面方法进行修改

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

复制代码

public class BreakAwayContext : DbContext

{

public BreakAwayContext():

base(“name=My_Test”)

{

}

}

复制代码

利用DbConnection

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

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


调用:

复制代码

static void Main(string[] args)

{

try

{

var lodging = new Lodging

{

Name = “Rainy Day Motel”,

};

[code]            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方法,在没有对模型执行任何操作的时候强制初始化。

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


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

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

1 CreateDatabaseIfNotExists

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

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


2 DropCreateDatabaseIfModelChanges

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

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


3 DropCreateDatabaseAlways

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

[code]            Database.SetInitializer(
                new DropCreateDatabaseAlways<BreakAwayContext>());
            using (var context = new BreakAwayContext())
            {
                context.Database.Initialize(true);
            }


文章转载自http://www.cnblogs.com/Gyoung/archive/2013/01/28/2876845.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: