第十八篇 .NET高级技术之Linq与EF Code-First Fluent API基础讲解

1.FluentApi简介

 

在这里提供了一个fluentapi基础的DEMO然后咱们在进一步的学习,直接上干货。

第一步在数据库创建一个表:person 

 

第二步:新建控制台程序FluentAPI

 

第三步:创建person 类 

 

 

第三步:创建pensonConfig 类

 

 

第四步:创建DBContext

 

第五步:应用

 

 

下面我们进行高级学习

 什么是Fluent API?

官方答案:EF 中内嵌的约定将 POCO 类映射到表。但是,有时您无法或不想遵守这些约定,需要将实体映射到约定指示外的其他对象,所以Fluent API和注解都是一种方法,这两种方法是用来配置EF,在映射属性时绕开约定。详情参考(https://msdn.microsoft.com/zh-cn/data/jj591617)

如何访问Fluent API?

通过自定义类(继承自DbContext )的OnModelCreating方法访问。

属性映射

主要配置:主键、数值长度、配置为必须、不映射,外键等

 

配置主键:

modelBuilder.Entity<ClassA>().HasKey(t => t.ID);    //配置ClassA的ID属性为主键

 

配置联合主键:

modelBuilder.Entity<ClassA>().HasKey(t => new { t.ID, t.Name });    //配置ClassA的ID和Name为主键

设置数据非数据库生成:

modelBuilder.Entity<ClassA>().Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);    //ClassA的Id属性不用数据库控制生成

设置字段最大长度:

modelBuilder.Entity<ClassA>().Property(t => t.Name).HasMaxLength(100);     //设置ClassA类的Name属性的最大长度为100,如果值长度100,会抛出 DbEntityValidationException异常

设置字段为必需:

modelBuilder.Entity<ClassA>().Property(t =>t.Id).IsRequired();   //设置ClassA类的Id属性为必需   

属性不映射到数据库:

modelBuilder.Entity<ClassA>().Ignore(t => t.A);    //调过ClassA类的A属性,让之不映射到数据库中

将属性映射到数据库中特定列名:

modelBuilder.Entity<ClassA>() 
    .Property(t => t.A) 
    .HasColumnName("A_a");   //将类ClassA的属性A映射到数据库中对应列名A_a

类中不指定外键,但在数据库中指定外键名:

modelBuilder.Entity<Staff>() 
    .HasRequired(c => c.Department) 
    .WithMany(t => t.Staffs) 
    .Map(m => m.MapKey("DepartmentID"));    //指定员工表中DepartmentID为Staff到Department的外键

指定属性映射的字段为Unicode类型:

modelBuilder.Entity<ClassA>() 
    .Property(t => t.Name) 
    .IsUnicode(true); 

设置属性映射的列的类型:

modelBuilder.Entity<Department>() 
    .Property(p => p.Name) 
    .HasColumnType("varchar");            //设置列为varchar类型

设置复杂类型的属性(何为复杂类型? 没指定主键的类型):

modelBuilder.ComplexType<Details>() 
    .Property(t => t.Location) 
    .HasMaxLength(20);
modelBuilder.Entity<OnsiteCourse>() 
    .Property(t => t.Details.Location) 
    .HasMaxLength(20);

显示设定为复杂类型:

modelBuilder.ComplexType<ClassA>();

 

将属性配置为用作乐观并发令牌:

方法1、用 ConcurrencyCheck 特性或 IsConcurrencyToken 方法

modelBuilder.Entity<OfficeAssignment>() 
    .Property(t => t.Timestamp) 
    .IsConcurrencyToken();

 

方法2、IsRowVersion 

modelBuilder.Entity<OfficeAssignment>() 
    .Property(t => t.Timestamp) 
    .IsRowVersion();

 

忽略类型,不映射到数据库中:

modelBuilder.Ignore<OnlineCourse>();

 

 

更多技术请关注

posted on 2019-05-23 11:30  笨小孩做开发 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/dullbaby/p/10910901.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值