EF 6 Code-First

Entity Framework 4.1之时,便引入了Code-First概念。它让我们将重点放在域类和上下文的编写当中,而对数据库的创建和更改交给Entity Framework来完成。

工作流程

安装Entity Framework 6

安装 EF Core DB Provider

EF Core允许我们通过提供者模型访问数据库。对于不同的数据库,有不同的EF核心DB提供程序可用。这些提供程序可以作为NuGet包使用。
此处以Ms SQL Server Database为例,需要在NuGet中安装名为Microsoft.EntityFrameworkcore.SqlServer的NuGet安装包

1.右键单击解决方案中的项目,选择选择NuGet程序包
图片01
2.搜索Microsoft.EntityFrameworkcore.SqlServer,点击安装
图片02
3.接受许可证
图片03
4.安装完成
图片4

同时,也可以通过 工具->NuGet包管理器->程序包管理器控制台 输入以下命令安装

1
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer

安装 EF Core Tools

安装EF Core Tools以使用EF core命令。同上,打开NuGet UI,安装名为Microsoft.EntityFramworkCore.Tools的NuGet安装包
05
至此,成功安装EF Core到解决方案中

Code-First 示例

在此示例中,我们先不设计数据库,而是根据需要创建一个学生类和年级类,代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
//学生类
public class Student
{
public int StudentID { get; set; }
public string StudentName { get; set; }
public DateTime? DateOfBirth { get; set; }
public byte[] Photo { get; set; }
public decimal Height { get; set; }
public float Weight { get; set; }

public Grade Grade { get; set; }
}
1
2
3
4
5
6
7
8
9
//年级类
public class Grade
{
public int GradeId { get; set; }
public string GradeName { get; set; }
public string Section { get; set; }

public ICollection<Student> Students { get; set; }
}

此外,我们还需要创建一个继承自DbContextcontext类,并在其中将学生类和年级类注册,代码示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
namespace EF6Console
{
public class SchoolContext:DbContext
{
public SchoolContext():base()
{

}
public DbSet<Student> Students{get;set;}
public DbSet<Grade> Grades{get;set;}
}
}

现在,我们可以使用context添加一个学生了,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace EF6Console
{
class Program
{
static void Main(string[] args)
{

using (var ctx = new SchoolContext())
{
var stud = new Student() { StudentName = "Bill" };

ctx.Students.Add(stud);
ctx.SaveChanges();
}
}
}
}

当你运行这段代码时,这个学生将会成功的插入数据库中。由于我们并没有给构造函数传递参数,所以会创建一个名为EF6Console.ShcoolContext的数据库,还创建了名为StudentsGrades的两个基于学生类和年级类的表。会为每个类中的属性设置合适的数据类型和长度,并将StudentIdGradeId作为主键,创建Grade_GradeId作为外键。代码如下:
图一
这样我们便在没有设计数据库的情况下使用Code-First创建了一个数据库,这是非常方便的。
注意:在修改这些类之后,会抛出InvalidOperationException异常,稍后将会讲解如何处理。

约定

约定是一组默认规则,当使用代码优先方法时,这些规则会根据域类自动配置概念模型。正如我们在前一章的code-first示例中所看到的,EF API从域类配置了主键、外键、关系、列数据类型等,而没有任何其他配置。这是因为EF代码优先约定。如果在域类中遵循它们,那么将根据约定配置数据库模式。

默认约定 描述
Schema 默认情况下,EF将所有DB对象创建到dbo模式中。
Table Name <实体类名称> + 's' ,EF将创建一个以“s”为后缀的实体类名的DB表,例如Student类将映射到Students表
Primary key Name 1.Id 2.<实体类名称>+"Id"。EF将为名为Id的属性或<实体类名> + "Id"(不区分大小写)创建一个主键列。
Foreign key property Name