数据注解
添加System.ComponentModel.DataAnnotations命名空间的using语句
EF 支持的完整注释列表为:
- KeyAttribute
- StringLengthAttribute
- MaxLengthAttribute
- ConcurrencyCheckAttribute
- RequiredAttribute
- TimestampAttribute
- ComplexTypeAttribute
- ColumnAttribute
- TableAttribute
- InversePropertyAttribute
- ForeignKeyAttribute
- DatabaseGeneratedAttribute
- NotMappedAttribute
Key/ForeignKey
Key
场景一:
Instructor实体和OfficeAssignment实体之间有“一对零”或“一对一”的关系。办公室只和讲师之间存在关系,因此其主键也是其Instructor实体的外键。但是实体框架不会自动将InstructorID识别为实体的主键,因为该命名不遵循实体框架约定。因此,我们使用Key特性来标记该属性为实体的主键。
场景二:
如果实体没有它自己的主键,但您想将属性名命名为类名-ID或ID以外的不同的名称,您同样可以使用Key特性。默认情况下实体框架将键视为非数据库生成的,因为该列用来标识关系。
ForeignKey
当两个实体之间存在有“一对零”或“一对一”关系时,实体框架无法自动辨认出那一端的关系是主体,那一端是依赖。一对一关系在每个类中使用导航属性来引用其他类。
ForeignKey特性可以应用于要建立关系的依赖类。
如果您省略ForeignKey特性,当您尝试创建迁移时系统会出现一个无法确定实体间关系的错误。
示例:
1 using System.ComponentModel.DataAnnotations; 2 using System.ComponentModel.DataAnnotations.Schema; 3 4 namespace ContosoUniversity.Models 5 { 6 public class OfficeAssignment 7 { 8 [Key] 9 [ForeignKey("Instructor")] 10 public int InstructorID { get; set; } 11 public string Location { get; set; } 12 public virtual Instructor Instructor { get; set; } 13 } 14 }
1 public class Instructor 2 { 3 public int ID { get; set; } 4 public string LastName { get; set; } 5 public string FirstMidName { get; set; } 6 public DateTime HireDate { get; set; } 7 public virtual ICollection<Course> Courses { get; set; } 8 public virtual OfficeAssignment OfficeAssignment { get; set; } 9 }
导航属性:
Instructor实体有一个可为空的OfficeAssignment导航属性(因为可能有讲师没有分配办公室),
并且OfficeAssignment实体有一个不可为空的Instuctor导航属性(因为一个办公室不可能在没有讲师的情况下分配出去--InstructorID是不可为空的)。
当Instructor实体具有OfficeAssignment实体关联的时候,每个实体在导航属性中都会有另一个实体的引用。
您可以把一个Required特性添加给Instructor导航属性来指明必须有相关的讲师,但您不需要这样做。因为InstructorId外键(同样也是表的主键)是不可为null的。
外键属性:
课程实体有一个DepartmentID外键属性,用来指向相关的Department实体,它有一个Department导航属性。当一个关联实体有一个导航属性时,实体框架不需要您添加外键属性到您的实体模型,实体框架在需要时会在数据库中自动创建外键。但在实体模型中拥有一个外键会让更新更简单、高效。例如,当您读取一个Course实体进行编辑,如果您选择不加载Department实体,那Department实体是空的。所以当您更新Course实体时,您必须先取得该实体关联的Department实体。如果在数据模型中包含了外键DepartmentID,您就不需要在更新前先取得Department实体。
DataType
示例:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.ComponentModel.DataAnnotations; 6 7 namespace ContosoUniversity.Models 8 { 9 public class Student 10 { 11 public int ID { get; set; } 12 public string LastName { get; set; } 13 public string FirstMidName { get; set; } 14 [DataType(DataType.Date)] 15 [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] 16 public DateTime EnrollmentDate { get; set; } 17 18 public virtual ICollection<Enrollment> Enrollments { get; set; } 19 } 20 }
DataType枚举
https://msdn.microsoft.com/zh-cn/library/system.componentmodel.dataannotations.datatype%28v=vs.110%29.aspx
- 成员名称
- 描述
- CreditCard
- 表示信用卡号码。
- Currency
- 表示货币值。
- Custom
- 表示自定义的数据类型。
- Date
- 表示日期值。
- DateTime
- 表示某个具体时间,以日期和当天的时间表示。
- Duration
- 表示对象存在的一段连续时间。
- EmailAddress
- 表示电子邮件地址。
- Html
- 表示一个 HTML 文件。
- ImageUrl
- 表示图像的 URL。
- MultilineText
- 表示多行文本。
- Password
- 表示密码值。
- PhoneNumber
- 表示电话号码值。
- PostalCode
- 表示邮政代码。
- Text
- 表示所显示的文本。
- Time
- 表示时间值。
- Upload
- 表示文件上载数据类型。
- Url
- 表示 URL 值。