Code-First中配置域类
我们在前一节学习了默认的代码优先约定。Code-First使用默认约定从您的域类构建概念模型。Code-First利用称为约定而不是配置的编程模式。这意味着您可以通过配置您的域类来为EF提供所需的信息来覆盖这些约定。有两种方法来配置您的域类。
- DataAnnotations
- 流利的API
DataAnnotation
DataAnnotation是一个简单的基于属性的配置,您可以将其应用于您的域类及其属性。您可以在System.ComponentModel.DataAnnotations命名空间中找到大多数属性。但是,DataAnnotation仅提供Fluent API配置的一个子集。因此,如果您在DataAnnotation中找不到某些属性,则必须使用Fluent API进行配置。
例如:
我们后面详讲。
EF 6和EF Core中的数据注释属性:
数据注释属性是可以应用于实体类或属性的.NET属性,以覆盖EF 6和EF Core中的默认约定。
数据注解的属性被包括在System.ComponentModel.DataAnnotations
和System.ComponentModel.DataAnnotations.Schema
中EF 6以及EF核心的命名空间。这些属性不仅在实体框架中使用,而且还可以用于ASP.NET MVC或数据控件。
这些数据注释属性在EF 6和EF Core中以相同的方式工作,并且在两者中都是有效的。
Table
按照默认约定,EF 6创建与上下文类中的< DbSet <TEntity>属性名称> + s(或es)匹配的表名,EF Core创建与DbSet<TEntity>
属性名称相同名称的Db列。
表格属性: [Table(string name, Properties:[Schema = string])
- 名称:Db表的名称。
- 架构:应在其中创建指定表的Db架构的名称。(可选的)
Column 列设置
按照EF 6和EF Core中的默认约定,它会在数据库表中创建一个与属性名称相同名称和顺序的列。
列属性: [Column (string name, Properties:[Order = int],[TypeName = string])
- 名称:数据库表中列的名称。
- 顺序:以零索引开始的列的顺序。(可选的)
- TypeName:列的数据类型。(可选的)
Key 主键
默认约定为名称为Id
或的属性创建主键列<Entity Class Name>Id
。Key属性重写此默认约定。
在EF 6中,Key属性和Column属性可以应用于将在数据库中创建复合主键列的实体类的多个属性。EF Core不支持使用Key属性创建组合键。您必须HasKey()
在EF Core中使用Fluent API 函数。
NotMapped 不映射
默认情况下,EF为实体类中的每个属性(必须具有;&set;)创建一个列。该[NotMapped]
属性重写此默认约定。您可以申请[NotMapped]
对您做一个或多个属性的属性不希望在一个数据库表中创建一个相应的列。
ForeignKey 外键
按照默认约定,当EF的名称与相关实体的主键属性匹配时,EF将其作为外键属性。
外键签名: [ForeignKey(name string)]
- 名称:关联的导航属性的名称或关联的外键的名称。
[ForeignKey]
属性重写外键的默认约定它允许我们在依赖实体中指定名称与主体实体的主键属性不匹配的外键属性。
[ForeignKey(name)]
属性可以以三种方式应用:
[ForeignKey(NavigationPropertyName)]
在依赖实体中的外键标量属性上[ForeignKey(ForeignKeyPropertyName)]
在相关实体中的相关参考导航属性上[ForeignKey(ForeignKeyPropertyName)]
在主体实体的导航属性上
[ForeignKey]对依赖实体中的外键属性 ForeignKey("属性名")
实体的外键属性和相关导航属性名可以被指定作为参数
[ForeignKey]在依赖实体的导航属性中
应用于导航属性,并且可以指定相关的外键属性名称,
[ForeignKey]主要实体中的导航属性:
应用于主体实体中的导航属性,相关的外键属性名称可以在从属实体中指定
InverseProperty
当两个实体有多个关系时,使用InverseProperty属性。
遇到多个对象关系,这样是无法确定那个对应那个的
它自己不能识别,我们就手动让他们配对就行了,[InverseProperty]
属性应用于两个集合导航属性,OnlineCourses
并ClassRoomCourses
在Course
实体中指定其相关的导航属性
您可以使用[ForeignKey]
attribute来配置外键名称
Required 非空验证
必需的属性可以在实体类被施加到一个或多个属性。EF将在数据库表中为应用了该Required
属性的属性创建一个NOT NULL列。
MaxLength
MaxLength属性指定一个属性所允许的数据值的最大长度,该属性依次设置数据库中相应列的大小。它可以应用于实体的string
或byte[]
属性。
StringLength
StringLength属性可以应用于string
实体类的属性。它指定了字符串属性所允许的最大字符数,该字符串属性依次设置nvarchar
数据库中相应列(在SQL Server中)的大小。
timestamp
EF 6和EF Core都包含Timestamp数据注释属性。它只能在实体类中应用一次到字节数组类型的属性
注:时间戳在数据库中执行添加,更新,时间戳字段会自动的更新值
ConcurrencyCheck
数据库表中的相应列将用于开放式并发检查使用where
子句。EF将StudentName
在UPDATE语句中包含列来检查乐观并发性。
注意:时间戳属性只能应用于单个字节数组属性,而ConcurrencyCheck属性可以应用于任何数量的任何数据类型的属性。