Entity Framework Core 约定,约定是默认规则,Entity Framework使用该规则基于您的域(实体)类构建模型。在 EF Core 从控制台程序开始入门 一章中,EF Core API基于域和上下文类创建数据库模式,无需任何其他配置,因为域类遵循这些约定。
Entity Framework Core 约定
请考虑以下示例实体和上下文类以了解默认约定。
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如何为上述实体创建数据库。
架构
默认情况下,EF Core将在dbo架构中创建所有数据库对象。
表
EF Core将为DbSet<TEntity>
上下文类中的所有属性创建数据库表,其名称与属性相同。它还将为实体创建表,这些实体不包含在DbSet
属性中,但可通过其他DbSet
实体中的引用属性访问。对于上面的示例,EF Core将为类中的属性创建Students
表,并为实体类中的属性创建表,即使该类不包含该属性。 DbSet<Student>SchoolContextGradeGradeStudentSchoolContextDbSet<Grade>
列(Column )
默认情况下,EF Core将为与该属性同名的实体类的所有标量属性创建列。它使用引用和集合属性来构建数据库中相应表之间的关系。
列数据类型
数据库表中列的数据类型取决于数据库的提供程序如何将C#数据类型映射到所选数据库的数据类型。下表列出了C#数据类型与SQL Server列数据类型之间的映射。
C# 类型 | 映射到数据库的类型 |
---|---|
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 | No mapping |
sbyte | No mapping (throws exception) |
object | No mapping |
可空列(Nullable Column )
EF Core为所有引用数据类型和可空的基本类型属性创建空列,例如string,Nullable <int>,decimal?。
不允许为null列(NotNull Column )
EF Core在数据库中为所有主键属性和原始类型属性创建NotNull列,例如int,float,decimal,DateTime等。
主键( Primary Key )
EF Core将为名为Id
或<Entity Class Name>Id
(不区分大小写)的属性创建主键列。例如,Students
如果Student
类包含名为id,ID,iD,Id,studentid,StudentId,STUDENTID或sTUdentID的属性,则EF Core将在表中创建一个列作为主键。
外键(Foreign Key )
根据外键约定,EF Core API将为具有以下命名模式之一的实体中的每个引用导航属性创建外键列。
<Reference Navigation Property Name>Id
<Reference Navigation Property Name><Principal Primary Key Property Name>
在我们的示例(Student
和Grade
实体)中,EF Core将GradeId
在Students
表中创建一个外键列,如下图所示。
下表列出了不同引用属性名称和主键属性名称的外键列名称。 .
依赖实体引用属性名 | 依赖实体里的外键属性 | 主键属性名 | 数据库里外键列名 |
---|---|---|---|
Grade | GradeId | GradeId | GradeId |
Grade | – | GradeId | GradeId |
Grade | – | Id | GradeId |
CurrentGrade | CurrentGradeId | GradeId | CurrentGradeId |
CurrentGrade | – | GradeId | CurrentGradeGradeId |
CurrentGrade | – | Id | CurrentGradeId |
CurrentGrade | GradeId | Id | GradeId |
索引(Index )
默认情况下,EF Core在主键列上创建聚集索引,在外键列上创建非聚集索引。