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>();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM