Entity Framework Core系列教程-8-Entity Framework Core中的约定

Entity Framework Core中的约定

约定是,使用Entity Framework根据您的领域模型(实体)类构建模型时的默认规则。在“第一个EF核心应用程序”一章中,EF核心API基于领域模型和上下文类创建数据库架构,而无需任何其他配置,因为领域模型类遵循约定。
以下示例为应用程序的领域模型(实体)和数据库上下文类,它遵循默认约定,无需配置。

public class Student
{
    public int StudentId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime DateOfBirth { get; set; }
    public byte[] Photo { get; set; }
    public decimal Height { get; set; }
    public float Weight { get; set; }
    public int GradeId { get; set; }
    public Grade Grade { get; set; }
}

public class Grade
{
    public int Id { get; set; }
    public string GradeName { get; set; }
    public string Section { get; set; }
    public IList Students { get; set; }
}

public class SchoolContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    { 
        optionsBuilder.UseSqlServer(@"Server=.\SQLEXPRESS;Database=SchoolDB;Trusted_Connection=True;");
    }

    public DbSet Students { get; set; }
}

让我们了解EF Core的约定以及EF Core API如何为上述实体创建数据库。

Schema(数据架构)

默认情况下,EF Core将在dbo模式中创建所有数据库对象。
Entity Framework Core系列教程-8-Entity Framework Core中的约定_第1张图片

Table(表)

EF Core将为上下文类中与属性名称相同的所有DbSet属性创建数据库表。它还将为实体创建表,这些表不包含在DbSet属性中,但可以通过其他DbSet实体中的引用属性访问。对于上面的示例,即使SchoolContext类不包含DbSet属性,EF Core也会在SchoolContext类中为DbSet属性创建Students表,在Student实体类中为Grade属性创建Grade表。
Entity Framework Core系列教程-8-Entity Framework Core中的约定_第2张图片

Column(列)

默认情况下,EF Core将为实体类的所有基本类型的属性创建与该属性同名的列。它使用引用类属性和集合属性在数据库中相应表之间建立关系。
Entity Framework Core系列教程-8-Entity Framework Core中的约定_第3张图片

列数据类型(Column Data Type)

数据库表中列的数据类型取决于数据库提供程序如何将C#数据类型映射到所选数据库的数据类型。下表列出了C#数据类型到SQL Server列数据类型之间的映射。

C# 数据类型 SQL Server数据类型
int int
string nvarchar(Max)
decimal decimal(18,2)
float real
byte[] varbinary(Max)
datetime datetime
bool bit
byte tinyint
short smallint
long bigint
double float
char
sbyte 无 (会抛异常)
object

Nullable Column(可空列)

EF Core为所有引用数据类型和可为空的原始类型属性创建可空列,例如string, Nullable, decimal? 等

NotNull Column(非空列)

EF Core在数据库中为所有主键属性和原始类型属性创建NotNull列,例如int,float,decimal,DateTime等。

Primary Key(主键)

EF Core将为名为Id或<实体类名称>Id(不区分大小写)的属性创建主键列。例如,如果Student类包含名为id,ID,iD,Id,studentid,StudentId,STUDENTID或sTUdentID的属性,则EF Core将在Student表中创建一列作为PrimaryKey(主键)。
Entity Framework Core系列教程-8-Entity Framework Core中的约定_第4张图片

Foreign Key(外键)

根据外键约定,EF Core API将使用以下命名模式之一为实体中的每个引用导航属性创建一个外键列。
Id

在我们的示例(学生和成绩实体)中,EF Core将在Student表中创建一个外键列GradeId,如下图所示。
Entity Framework Core系列教程-8-Entity Framework Core中的约定_第5张图片
下表列出了不同引用属性名称和主键属性名称的外键列名称:

从属实体中的引用属性名称 从属实体中的外键属性名称 主体主键属性名称 数据库中的外键列名称
Grade GradeId GradeId GradeId
Grade - GradeId GradeId
Grade - Id GradeId
CurrentGrade CurrentGradeId GradeId CurrentGradeId
CurrentGrade - GradeId CurrentGradeGradeId
CurrentGrade - Id CurrentGradeId
CurrentGrade GradeId Id GradeId

索引

默认情况下,EF Core在主键列上创建聚簇索引,在外键列上创建非聚簇索引。

在下一章中我们将学习EF Core中的关系约定。

你可能感兴趣的:(entity,framework,core)