Entity Framework Fluent API
2013-09-25 13:25
477 查看
前言
使用DataAnnotation非常简单,但对于EntityFramework中的特性,就要在实体类中引入EntityFramework程序集,但实体类最好能是保持与架构无关性的POCO类,才能更具通用性。所以,最好是在数据层中使用FluentAPI在数据层中进行实体类与数据库之间的映射工作。从功能上而言Data Annotations是Fluent API的一个子集, Data Annotations可以实现的功能Fluent API都能实现。
Fluent API特性列举
当然,System.ComponentModel.DataAnnotations命名空间的DataAnnotation在EntityFramework程序集中也有相应的API:
设置属性需要在数据库操作上下文的
1.HasKey - KeyAttribute:配置此实体类型的主键属性
2.IsRequired - RequiredAttribute:将此属性配置为必需属性。用于存储此属性的数据库列将不可以为null
3.HasMaxLength - MaxLengthAttribute:将属性配置为具有指定的最大长度
4.IsConcurrencyToken - ConcurrencyCheckAttribute:将属性配置为用作开放式并发标记
5.IsRowVersion - TimestampAttribute:将属性配置为数据库中的行版本。实际数据类型将因使用的数据库提供程序而异。将属性设置为行版本会自动将属性配置为开放式并发标记。
上面这些API均无需引用EntityFramework,推荐使用DataAnnotation方式来设置映射。以下API的DataAnnotation特性是在EntityFramework中定义,如果也使用DataAnnotation方式来设置映射,就会给实体类增加额外的第三方程序集的依赖。所以以下API的映射推荐使用FluentAPI的方式来设置映射
6.ToTable - TableAttribute:配置此实体类型映射到的表名
7.HasColumnName - ColumnAttribute:配置用于存储属性的数据库列的名称
8.HasForeignKey - ForeignKeyAttribute:将关系配置为使用在对象模型中的外键属性。如果未在对象模型中公开外键属性,则使用Map方法
9. Ignore - NotMappedAttribute:从模型中排队某个属性,使该属性不会映射到数据库
10.HasRequired:通过此实体类型配置必需关系。除非指定此关系,否则实体类型的实例将无法保存到数据库。数据库中的外键不可为null。
11.Map:将关系配置为使用未在对象模型中公开的外键属性。可通过指定配置操作来自定义列和表。如果指定了空的配置操作,则约定将生成列名。如果在对象模型中公开了外键属性,则使用 HasForeignKey 方法。并非所有关系都支持在对象模型中公开外键属性。
12.MapKey:配置外键的列名。
同上。。
使用DataAnnotation非常简单,但对于EntityFramework中的特性,就要在实体类中引入EntityFramework程序集,但实体类最好能是保持与架构无关性的POCO类,才能更具通用性。所以,最好是在数据层中使用FluentAPI在数据层中进行实体类与数据库之间的映射工作。从功能上而言Data Annotations是Fluent API的一个子集, Data Annotations可以实现的功能Fluent API都能实现。
Fluent API特性列举
当然,System.ComponentModel.DataAnnotations命名空间的DataAnnotation在EntityFramework程序集中也有相应的API:
设置属性需要在数据库操作上下文的
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); }
1.HasKey - KeyAttribute:配置此实体类型的主键属性
modelBuilder.Entity<Order>().HasKey(order => order.OrderID);
2.IsRequired - RequiredAttribute:将此属性配置为必需属性。用于存储此属性的数据库列将不可以为null
modelBuilder.Entity<Order>().HasRequired(order => order.OrderName);
3.HasMaxLength - MaxLengthAttribute:将属性配置为具有指定的最大长度
modelBuilder.Entity<Order>().Property(order => order.OrderName).HasMaxLength(30);
4.IsConcurrencyToken - ConcurrencyCheckAttribute:将属性配置为用作开放式并发标记
modelBuilder.Entity<Order>().Property(order => order.Address).IsConcurrencyToken();
5.IsRowVersion - TimestampAttribute:将属性配置为数据库中的行版本。实际数据类型将因使用的数据库提供程序而异。将属性设置为行版本会自动将属性配置为开放式并发标记。
modelBuilder.Entity<Order>().Property(order => order.TimeStamp).IsRowVersion();//通过指定“TimeStamp”进行并发版本控制
上面这些API均无需引用EntityFramework,推荐使用DataAnnotation方式来设置映射。以下API的DataAnnotation特性是在EntityFramework中定义,如果也使用DataAnnotation方式来设置映射,就会给实体类增加额外的第三方程序集的依赖。所以以下API的映射推荐使用FluentAPI的方式来设置映射
6.ToTable - TableAttribute:配置此实体类型映射到的表名
modelBuilder.Entity<Order>().ToTable("Order", "Order");//指定“Order”对应表名及架构
7.HasColumnName - ColumnAttribute:配置用于存储属性的数据库列的名称
modelBuilder.Entity<Order>().Property(order => order.Note).HasColumnName("Notes").HasColumnType("ntext");//指定“Note”对应列名为“Notes”,并指定数据类型
8.HasForeignKey - ForeignKeyAttribute:将关系配置为使用在对象模型中的外键属性。如果未在对象模型中公开外键属性,则使用Map方法
modelBuilder.Entity<Order>().HasRequired(order => order.customer).WithMany().HasForeignKey(order => order.CustomerNo);
9. Ignore - NotMappedAttribute:从模型中排队某个属性,使该属性不会映射到数据库
modelBuilder.Entity<Order>().Ignore(order => order.PhotoPath);
10.HasRequired:通过此实体类型配置必需关系。除非指定此关系,否则实体类型的实例将无法保存到数据库。数据库中的外键不可为null。
modelBuilder.Entity<Order>().HasRequired(order => order.customer);
11.Map:将关系配置为使用未在对象模型中公开的外键属性。可通过指定配置操作来自定义列和表。如果指定了空的配置操作,则约定将生成列名。如果在对象模型中公开了外键属性,则使用 HasForeignKey 方法。并非所有关系都支持在对象模型中公开外键属性。
modelBuilder.Entity<Order>().HasRequired(c => c.customer).WithMany().Map(m => m.MapKey("CustomerOrder"));
12.MapKey:配置外键的列名。
同上。。
相关文章推荐
- leetcode_question_55 Jump Game
- build.bat
- DuiLib帮助文档篇之四通知事件
- DuiLib帮助文档篇之三XML配置项
- DuiLib帮助文档篇之二UIBase
- DuiLib帮助文档篇之一UIManager
- ThinkDev.Logging-Queue模块介绍
- leetcode_question_50 Pow(x, n)
- UVA - 10911 Forming Quiz Teams
- leetcode_question_66 Plus One
- leetcode_question_75 Sort Colors
- iOS开发 粗解UIDynamicAnimator
- BlockingQueue
- UIView的frame与bounds
- UIProgressView 进度指示器
- UVA 11235/HDU 1806/POJ 3368 Frequent values
- 维护一套同时兼容 iOS 6 和 iOS 7,并且能够自动适应两个系统的 UI 风格的代码
- 图像处理中的全局优化技术(Global optimization techniques in image processing and computer vision) (三)
- break & continue
- Individual project1- word frequency program