EF Code First学习笔记:数据库创建

控制数据库的位置

默认情况下,数据库是创建在localhost\SQLEXPRESS服务器上,并且默认的数据库名为命名空间+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);
                }
相关推荐
ClickHouseDB3 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906943 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
时间售卖铺4 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw4 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社5 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
一木 之林5 小时前
Dify学习笔记 03 · RAG检索增强生成:三代范式、评估与落地(第40-45、55-56集)
笔记·小程序·交互·dify
lbb 小魔仙5 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
apple-mapping6 小时前
网络RTK定位学习总结
学习·网络rtk
captain3767 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你02147 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法