Code Copied

EF Code First系列–03.EF中的约定

1. Table, Schema, Columns的命名约定

1.1 Table命名约定

Table的名称是实体名称的复数形式。
Entity Framework是通过Pluralization Service来决定Table的命名。
例如:Prodcut实体对应Products表,Person实体对应People表。

Hide Code | Copy Code

public class PmsContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    public DbSet<Person> PersonList { get; set; }
}

image

1.2 Schema的命名约定

EF的默认schema是dbo,和数据库是一致的。

1.3 Column的命名约定

Column的名称和实体属性的名称一致。

1.4 通过DataAnnotation自定义Table, Shema, Column命名

[Table("person", Schema = "cus" )]
public class Person
{
    public int Id { get; set; }
    
    [Column("fname")]
    public string FirstName { get; set; }
    [Column("lname")]
    public string LastName { get; set; }
}

image

2. 主键约定

实体中有命名为Id或者[Type Name] + Id的属性,映射为数据库的主键列。
如果在实体类中不包含这种命名的属性,要指定其他属性为主键时,请用DataAnnotation的Key特性或者Fluent API的HasKey方法实现自定义主��属性。

3. string属性约定

实体类中的string属性自动映射为数据库的nvarchar(max) null类型。
如果要自定义字符串的长度,请用DataAnnotation的MaxLength特性、StringLength特性或者Fluent API的HasMaxLength方法实现。
如果要设定string为非Unicode的,必须要使用Fluent API的IsUnicode方法,DataAnnotation没有提供属性非Unicode设定的实现。

4. byte[]属性约定

实体类中的byte[]属性自动映射为数据库的varbinary(max)类型。
自定义长度的方法同上。
如果byte[]属性中存放的是image,也可以通过DataAnnotation的[Column(TypeName = "image")]或者Fluent API的HasColumnType("image")方法实现。

5. bool约定

实体类中的bool属性自动映射为数据库的bit not null类型。
实体类中的bool? (即Nullable<bool>类型)属性自动映射为数据库的bit null类型。

6. One-to-Many关系约定

在Customer类中可以有多个Order,Customer类可以通过IList<Order>属性去访问属于这个Customer的所有订单。
另外,Order类中拥有Customer属性,所以可以知道Order是属于哪个Customer的。
Code First会认为Customer类和Order类属于One-to-Many关系。
在Code First的约定中,当分别生成Order和Customer对应的表时,表Orders会包含一个指向Customers表的外键(例如Customer_CustomerId列) ,通过外键列可以知道Order属于哪个Customer。