zoukankan      html  css  js  c++  java
  • 第十八篇 .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>();

    更多技术请关注

  • 相关阅读:
    【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
    【10.7校内测试】【队列滑窗】【2-sat】【贪心+栈二分+线段树(noip模拟好题)】【生日祭!】
    【10.6校内测试】【小模拟】【hash+线段树维护覆盖序列】
    【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】
    【10.5校内测试】【DP】【概率】
    【洛谷】1174:打砖块
    【10.4校内测试】【轮廓线DP】【中国剩余定理】【Trie树+博弈】
    【10.3校内测试【国庆七天乐!】】【DP+组合数学/容斥】【spfa多起点多终点+二进制分类】
    【二分图】性质
    【9.23校内测试】【抽屉原理】【乱搞??(找众数】【Trie】
  • 原文地址:https://www.cnblogs.com/dullbaby/p/10910901.html
Copyright © 2011-2022 走看看