zoukankan      html  css  js  c++  java
  • FluentAPI详细用法

      •  什么是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>();
  • 相关阅读:
    网站架构探索(3)负载均衡的方式
    架构师之路(6)OOD的开闭原则
    也谈IT人员流失问题 王泽宾
    技术体系的选择之Java篇
    网站架构探索(2)CDN基本常识
    设计模式之单例模式
    网站架构探索(1)序言 王泽宾
    架构师之路(39)IoC框架
    发展之道:简单与专注
    修me30打印机
  • 原文地址:https://www.cnblogs.com/wangshaod/p/10025836.html
Copyright © 2011-2022 走看看