前言

做 .NET 项目时需要用到微软自家的 ORM 框架 Entity Framework,由于之前学识比较浅,没有接触过 Entity Framework,趁着这个机会,赶紧 Google 了一下相关教程,这里就在前辈们的教程基础上,记录一下相关要点,供自己以后查阅。

Entity Framework 在 Code First 模式下与数据库的连接

Entity Framework 数据库连接配置

在安装了 Entity Framework 后,会自动添加一个 App.config 文件,在该文件中配置 defaultConnectionFactory 节点,此后不需要再在其他地方进行数据库连接的配置,也不需要指定数据库连接,具体如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="Data Source=(local); Database=ExamDatabase; User ID=sa; Password=; MultipleActiveResultSets=True" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

除了上述配置方法外,还可以配置常用的 connectionStrings,修改 App.config 文件如下即可:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="ExamContext" connectionString="Data Source=(local); Database=ExamDatabase; User ID=sa; Password=; MultipleActiveResultSets=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

Entity Framework DbContext 连接数据库

新建一个自定义的继承自 DbContext 的类 ExamContext

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;

namespace Example
{
    public class ExamContext : DbContext
    {
        static ExamContext()
        {
        	Database.SetInitializer<ExamContext>(null);
        	// Database.SetInitializer(new CreateDatabaseIfNotExists<ExamContext>());
        	// Database.SetInitializer(new DropCreateDatabaseAlways<ExamContext>());
            // Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ExamContext>());
        }

        public ExamContext() : base("name=ExamContext")
        {
        	// 禁用延迟加载
    		this.Configuration.LazyLoadingEnabled = false;
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        	// 禁用一对多级联删除
    		modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    		// 禁用多对多级联删除
    		modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
    		// 禁用默认表名复数形式
    		modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

在使用 DbContext 时,就用到了 App.config 文件中配置的 connectionStrings,因为在构造方法中指定了连接字符串 ExamContext

DBContext 数据库初始化方式

Entity Framework 通过 Database.SetInitializer 来指定需要的数据库初始化方式,可指定的数据库一共有三种:

CreateDatabaseIfNotExist

CreateDatabaseIfNotExist 是初始化数据库的默认方式,用于当数据库不存在时,自动创建数据库。由于该方式是默认的,所以可以不用写代码,当然也可以用代码来指定:

1
Database.SetInitializer(new CreateDatabaseIfNotExists<ExamContext>());
DropCreateDatabaseWhenModelChanges

DropCreateDatabaseWhenModelChanges 用于当数据模型发生改变时,先删除原数据库,再创建新数据库:

1
Database.SetInitializer(new DropCreateDatabaseWhenModelChanges<ExamContext>)();
DropCreateDatabaseAlways

DropCreateDatabaseAlways 用于每次创建数据库前,均先删除原有的数据库,无论数据模型是否发生变化:

1
Database.SetInitializer(new DropCreateDatabaseAlways<ExamContext>)();

然而,更多的时候,我们希望 Entity Framework Code First 在与数据库不匹配时,宁可报出数据库连接错误,而不希望对数据库进行任何的删除创建操作,这时我们可以使用 Entity Framework 提供的关闭数据库初始化操作:

1
Database.SetInitializer<ExamContext>(null);

我们可以在静态构造方法中设置上述的数据库初始化方式。

DbContext 连接数据库的一些设置

在实际使用 Entity Framework Code First 操作数据库时,通常会在继承自 DbContext 的类中做一些数据库操作设置。

禁用延迟加载

有的时候我们可能需要禁用延迟加载(LazyLoading),这就需要在代码中设置一下(关于延迟加载的优点和缺点,暂时可以先参考文章 EF 使用延迟加载的本质原因):

1
2
3
4
5
public ExamContext() : base("name=ExamContext")
{
    // 禁用延迟加载
    this.Configuration.LazyLoadingEnabled = false;
}
禁用关系数据的级联删除

级联删除就是,在存在关联关系的数据表之间,删除主表记录的时候,自动删除从表中关联的记录。但是在实际项目中,我们可能不想使用这种级联删除功能,就算需要删除从表的记录,也是更愿意通过代码来手动删除,以确保安全。禁用级联删除的代码如下:

1
2
3
4
5
6
7
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // 禁用一对多级联删除
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
    // 禁用多对多级联删除
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
}
禁用默认表名复数形式

Entity Framework Code First 在根据类名生成数据表时,生成的数据表的表名,默认是类名的复数形式,可以通过代码禁用:

1
2
3
4
5
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // 禁用默认表名复数形式
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}

当然还有其他相关的一些设置项,不一一列举。