程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> EF Fluent API上,effluentapi上

EF Fluent API上,effluentapi上

編輯:關於.NET

EF Fluent API上,effluentapi上


 什麼是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>();

 

       

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved