Entity Framework DataAnnotations
前言
DataAnnotation 特性由.NET 3.5中引进,给.NET中的类提供了一种添加验证的方式。但是在EF中它又可以对映射关系进行控制,相比较Fluent API使用起来要简单一些。
DataAnnotation特性列举
DataAnnotation由命名空间System.ComponentModel.DataAnnotations提供。下面列举实体模型中常用的DataAnnotation特性:
1.KeyAttribute:对数据库中表的主键的设置
[Key] public int OrderID { get ; set ; } |
2.RequiredAttribute:对应数据库中字段的数据是否可以为null
[Required] public string OrderName { get ; set ; } |
3.MaxLengthAttribute:对应数据库中字符串类型字段的最大长度
[MaxLength(60)] public string Employee{ get ; set ;} |
4.MinLengthAttribute:在数据库中无对应,但在代码中字符串最小长度
[MaxLength(60),MinLength(10)] public string Employee{ get ; set ;} |
5.ConcurrencyCheckAttribute:指定用于开放式并发检查的列的数据类型
[ConcurrencyCheck] public string Address { get ; set ; } |
6.TimestampAttribute:将列的数据类型指定为行版本
[Timestamp] public byte [] TimeStamp { get ; set ; } |
System.ComponentModel.DataAnnotations命名空间中只定义了部分实体验证的特性,在EntityFramework程序集中定义了更多的数据映射特性
7.DatabaseGeneratedAttribute:标记指定实体属性是由数据库生成的,并指定生成策略(None数据库不生成值,Identity当插入行时,数据库生成值,Computed当插入或更新行时,数据库生成值)
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime CreateDate { get ; set ; } |
8.ColumnAttribute:指定实体属性在数据库中的列名及数据类型
[Column( "Notes" , TypeName = "ntext" )] public string Note { get ; set ; } |
9.TableAttribute:指定实体类对应的数据表名
[Table( "Order" ,Schema= "Order" )] public class Order |
10.ForeignKeyAttribute:指定导航属性的外键字段
public class Customer { public int ID { get ; set ; } public string Name { get ; set ; } } [ForeignKey( "ID" )] public Customer customer { get ; set ; } |
11.NotMappedAttribute:标记指定实体属性在创建数据库中不创建对应字段
[NotMapped] public string PhotoPath { get ; set ; } |
12.ComplexTypeAttribute:标记指定实体属性是将一个对象作为另一个对象的属性,映射到数据库中则子对象表现为多个属性字段
[ComplexType] public class Name { public string FirstName { get ; set ; } public string LastName { get ; set ; } } public Name Name { get ; set ; } |
对于实体关系对应的数据表关系,无非“0:1,1:1,0:N,1:N,N:N”这几种,可以使用导航属性中的数据类型来表示,0…1端使用单实体类型表 示,N端使ICollection<T>集合类型表示。对于单实体端,默认是可为空的,即为0关系,如果要设置为1关系,要使用 [Required]标签来进行标记。但对于一对一中的关系主体与依赖对象确无法做更细节的控制。
注意:DataAnnotations可以同时在同一个类后者属性上使用多个标记属性,上面的例子中对于每个类或属性只使用了一个单独的标记属性是为了说明起来更加简单;另外声明的例子中同时使用“ConcurrencyCheck”和“TimeStamp”指定了不同的列只是为了演示,一般情况下我们通过其中一种方式即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构