EFCodeFirst属性映射约定

EFCodeFirst属性映射约定

EFCodeFirst
属性映射约定

CodeFirst与数据表之间得映射方式又两种:Data Annotation和Fluent API
默认约定:

表名为类名的复数。
创建表得所有者为dbo。

int类型属性映射成数据库int类型。
string类型属性映射成数据库NVARCHAR类型。
若类的字符串类型属性未设置MaxLength,则生成对应的列类型为NVARCHAR(MAX)。

默认主键约束:属性名为[ID]或[类名 + ID]

对于int类型主键,会自动增长。

1 自定义映射表名以及所有者

Data Annotation

  1. //必要引用 
  2. using System.ComponentModel.DataAnnotations.Schema; 
  3. //映射表名 
  4. [Table("Product")] 
  5. public class Product 
  6. //映射表名以及所有者 
  7. [Table("Product", Schema = "dbo")] 
  8. public class Product 

Fluent API方式

  1. //重写OnModelCreating方法实现 映射表名 
  2. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

  3. modelBuilder.Entity<Product>().ToTable("Product"); 

  4. //重写OnModelCreating方法实现 映射表名以及所有者 
  5. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

  6. modelBuilder.Entity<Product>().ToTable("Product", "dbo"); 

2.字段名、长度、数据类型及是否可空

Data Annotation

  1. //映射列名 
  2. [Column("ProductID")] 
  3. public int ProductID { get; set; } 
  4. //映射列名,长度,是否为空 
  5. [MaxLength(100)] 
  6. [Required, Column("ProductName")] 
  7. public string ProductName { get; set; } 
  8. //指定映射的数据类型 
  9. [Column("UnitPrice", TypeName = "MONEY")] 
  10. public decimal UnitPrice { get; set; } 
  11. //设置Text 
  12. [Column("Remark", TypeName = "text")] 
  13. public string Remark { get; set; } 

Fluent API方式

  1. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

  2. //映射列名 
  3. modelBuilder.Entity<Product>().Property(t => t.ProductID) 
  4. .HasColumnName("ProductID"); 
  5. //映射列名,是否为空,最大长度 
  6. modelBuilder.Entity<Product>().Property(t => t.ProductName) 
  7. .IsRequired() 
  8. .HasColumnName("ProductName"
  9.      .HasMaxLength(100); 

  10. //指定映射的数据类型 
  11. modelBuilder.Entity<Product>().Property(t => t.UnitPrice) 
  12. .HasColumnName("UnitPrice"
  13. .HasColumnType("MONEY"); 
  14. //设置Text 
  15. modelBuilder.Entity<Category>().Property(t => t.Remark) 
  16. .HasColumnName("Remark"
  17. .HasColumnType("text"); 

3.主键

Data Annotation

  1. [Key] 
  2. [Column("ProductID")] 
  3. public int ProductID { get; set; } 

Fluent API方式

  1. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

  2. modelBuilder.Entity<Product>().HasKey(t => t.ProductID); 

  3. //多主键 
  4. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

  5. modelBuilder.Entity<Product>().HasKey(t => new { t.KeyID, t.CandidateID }); 

4.数据库自动生成字段值

Data Annotation

  1. //取消int类型主键自动增长 
  2. [Key] 
  3. [Column("ProductID")] 
  4. [DatabaseGenerated(DatabaseGeneratedOption.None)] 
  5. public int ProductID { get; set; } 
  6. [Key] 
  7. [Column("CategoryID")] 
  8. [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
  9. public int CategoryID { get; set; } 

Fluent API方式

  1. //取消int类型主键自动增长 
  2. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

  3. modelBuilder.Entity<Product>().HasKey(t => t.ProductID); 
  4. modelBuilder.Entity<Product>().Property(t => t.ProductID) 
  5. .HasColumnName("ProductID"
  6. .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

  7. modelBuilder.Entity<Category>().ToTable("Category", "dbo"); 
  8. modelBuilder.Entity<Category>().HasKey(t => t.CategoryID); 
  9. modelBuilder.Entity<Category>().Property(t => t.CategoryID) 
  10. .HasColumnName("CategoryID"
  11. .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

5.数字类型长度及精度

Fluent API方式

  1. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

  2. modelBuilder.Entity<Product>().Property(t => t.UnitPrice) 
  3. .HasColumnName("UnitPrice"
  4. .HasPrecision(18, 2); 

6.非数据库字段属性

Data Annotation

  1. [NotMapped] 
  2. public string Remark { get; set; } 

Fluent API方式

  1. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

  2. modelBuilder.Entity<Product>().Ignore(t => t.Remark); 

7.Fluent API配置Configuration映射类

方便维护

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using System.Text; 
  5.  
  6. using System.ComponentModel.DataAnnotations.Schema; 
  7. using System.Data.Entity.ModelConfiguration; 
  8.  
  9. using Portal.Entities; 
  10.  
  11. namespace Portal.Mapping 

  12. public class ProductMap : EntityTypeConfiguration<Product

  13. public ProductMap() 

  14. // Primary Key 
  15. this.HasKey(t => t.ProductID); 
  16.  
  17. // Properties 
  18. this.Property(t => t.ProductID) 
  19. .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
  20. this.Property(t => t.ProductName) 
  21. .IsRequired() 
  22. .HasMaxLength(100); 
  23.  
  24. // Table & Column Mappings 
  25. this.ToTable("Product"); 
  26. this.Property(t => t.ProductID).HasColumnName("ProductID"); 
  27. this.Property(t => t.ProductName).HasColumnName("ProductName"); 
  28. this.Property(t => t.UnitPrice) 
  29. .HasColumnName("UnitPrice"
  30. .HasPrecision(18, 2); 



  1. protected override void OnModelCreating(DbModelBuilder modelBuilder) 

  2. modelBuilder.Configurations.Add(new ProductMap()); 

原文地址:https://www.cnblogs.com/mmry/p/7060608.html