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<Student> Students { get; set; }
}

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

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

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

Schema(数据架构)

默认情况下,EF Core将在dbo模式中创建所有数据库对象。
在这里插入图片描述

Table(表)

EF Core将为上下文类中与属性名称相同的所有DbSet<TEntity>属性创建数据库表。它还将为实体创建表,这些表不包含在DbSet属性中,但可以通过其他DbSet实体中的引用属性访问。对于上面的示例,即使SchoolContext类不包含DbSet<Grade>属性,EF Core也会在SchoolContext类中为DbSet<Student>属性创建Students表,在Student实体类中为Grade属性创建Grade表。
在这里插入图片描述

Column(列)

默认情况下,EF Core将为实体类的所有基本类型的属性创建与该属性同名的列。它使用引用类属性和集合属性在数据库中相应表之间建立关系。
在这里插入图片描述

列数据类型(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<int>, 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(主键)。
在这里插入图片描述

Foreign Key(外键)

根据外键约定,EF Core API将使用以下命名模式之一为实体中的每个引用导航属性创建一个外键列。
<Reference Navigation Property Name>Id
<Reference Navigation Property Name><Principal Primary Key Property Name>
在我们的示例(学生和成绩实体)中,EF Core将在Student表中创建一个外键列GradeId,如下图所示。
在这里插入图片描述
下表列出了不同引用属性名称和主键属性名称的外键列名称:

从属实体中的引用属性名称 从属实体中的外键属性名称 主体主键属性名称 数据库中的外键列名称
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中的关系约定。

posted @ 2020-02-07 21:36  星空天宇  阅读(198)  评论(0编辑  收藏  举报