EF 6 Code-First中的默认约定
约定是一组默认规则,在使用Code-First时,这些规则会根据域类自动配置概念模型。正如你在前一章的Code-First示例中看到的,EF API配置了域类中的主键、外键、关系、列数据类型等,而没有任何额外的配置。这是因为EF Code-First约定。如果在域类中遵循它们,那么数据库模式将基于约定进行配置。这些EF 6.x Code-First约定定义在System.Data.Entity.ModelConfiguration.Conventions命名空间中。
下表列出了默认的code first约定:
默认约定 | 描述 |
---|---|
Schema(架构) | 默认情况下,EF将所有DB对象创建到dbo模式中。 |
Table Name(表名) | <实体类名> + ‘s’。EF将创建一个以’s’结尾的实体类名称的DB表,例如Student域类(entity)将映射到Students表。 |
Primary key Name(主键) | (1)、 Id (2)、 <实体类名> + “Id” (不分大小写)。EF将为属性Id或<实体类名> + “Id”(不区分大小写)创建一个主键列。 |
Foreign key property Name(外键) | 默认情况下,EF将查找与主体实体主键名称相同的外键属性。如果外键属性不存在,EF将在Db表中创建一个FK列,该列具有<依赖导航属性名称> + “_” + <主体实体主键属性名称>。例如,如果Student实体不包含Grade的外键属性,EF将在Students表中创建Grade_GradeId外键列。 |
Null column(null 列) | EF为所有引用类型属性和可为空的基本属性创建一个空列,例如string, Nullable,Student,Grade (所有类类型属性) |
Not Null Column(非空列) | EF为主键属性和非空值类型属性创建NotNull 列,例如int, float, decimal, datetime等。 |
DB Columns order(列顺序) | EF将以与实体类中的属性相同的顺序创建DB列。但是,主键列将会被放到第一位。 |
Properties mapping to DB(映射到DB的属性) | 默认情况下,所有属性都将映射到数据库。使用[NotMapped]特性从DB映射中排除属性或类。 |
Cascade delete(级联删除) | 默认为所有类型的关系启用。 |
下表列出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 | No mapping |
sbyte | No mapping(throws exception) |
object | No mapping |
下图说明了与数据库映射的约定。
关联关系约定
EF 6使用默认约定的导航属性推断一对多关系。
注意:EF 6不包括一对一和多对多关系的默认约定。您需要使用Fluent API或DataAnnotation来配置它们。
复杂类型约定
Code First为不包括key属性的类创建复杂类型,并且没有使用数据注释特性或Fluent API注册主键。
这是对code first约定的概述。可以使用DataAnnotation或Fluent API重写这些约定。
参考
https://www.entityframeworktutorial.net/
https://msdn.microsoft.com/