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. using System.ComponentModel.DataAnnotations.Schema; 

  6. using System.Data.Entity.ModelConfiguration; 


  7. using Portal.Entities; 


  8. namespace Portal.Mapping 



  9. public class ProductMap : EntityTypeConfiguration<Product> 



  10. public ProductMap() 



  11. // Primary Key 

  12. this.HasKey(t => t.ProductID); 


  13. // Properties 

  14. this.Property(t => t.ProductID) 

  15. .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

  16. this.Property(t => t.ProductName) 

  17. .IsRequired() 

  18. .HasMaxLength(100); 


  19. // Table & Column Mappings 

  20. this.ToTable("Product"); 

  21. this.Property(t => t.ProductID).HasColumnName("ProductID"); 

  22. this.Property(t => t.ProductName).HasColumnName("ProductName"); 

  23. this.Property(t => t.UnitPrice) 

  24. .HasColumnName("UnitPrice") 

  25. .HasPrecision(18, 2); 







  1. protected override void OnModelCreating(DbModelBuilder modelBuilder) 



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



EFCodeFirst属性映射约定的更多相关文章

  1. EFCodeFirst关系映射约定

    EFCodeFirst关系映射约定 EFCodeFirst 关系映射约定 默认多重关系的一些约定规则: 1.一对多关系 两个类中分别包含一个引用和一个集合属性. 两个类中一个类包含另一个类的引用属性. ...

  2. Entity Framework Code First属性映射约定

    Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...

  3. 【EF】Entity Framework实现属性映射约定

    Entity Framework Code First属性映射约定中“约定”一词,在原文版中为“Convention”,翻译成约定或许有些不好理解,这也是网上比较大多数的翻译,我们就当这是Entity ...

  4. 补习知识:Entity Framework Code First属性映射约定

    Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...

  5. Entity Framework Code First属性映射约定 转载https://www.cnblogs.com/libingql/p/3352058.html

    Entity Framework Code First属性映射约定   Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Flue ...

  6. Entity Framework实现属性映射约定

    Entity Framework Code First属性映射约定中“约定”一词,在原文版中为“Convention”,翻译成约定或许有些不好理解,这也是网上比较大多数的翻译,我们就当这是Entity ...

  7. EntityFramework Core 2.1重新梳理系列属性映射(一)

    前言 满血复活啦,大概有三个月的时间没更新博客了,关于EF Core最新进展这三个月也没怎么去看,不知现阶段有何变化没,本文将以EF Core 2.1稳定版本作为重新梳理系列,希望对看本文的你有所帮助 ...

  8. 10.2.翻译系列:使用Fluent API进行属性映射【EF 6 Code-First】

    原文链接:https://www.entityframeworktutorial.net/code-first/configure-property-mappings-using-fluent-api ...

  9. Hibernate持久化类属性映射

    Hibernate充当应用程序和数据库之间的中间件,实现二者之间的交互操作,他对JDBC进行了封装,以完全面向对象的方式来操作数据. 适用于有多个数据源的情况下,不必去考虑不同数据源的操作差异. Hi ...

随机推荐

  1. Pytest(8)parametrize参数化

    前言 当某个接口中的一个字段,里面规定的范围为1-5,你5个数字都要单独写一条测试用例,就太麻烦了,这个时候可以使用pytest.mark.parametrize装饰器可以实现测试用例参数化. 官方示 ...

  2. The 2019 ICPC Asia Shanghai Regional Contest H Tree Partition k、Color Graph

    H题意: 给你一个n个节点n-1条无向边构成的树,每一个节点有一个权值wi,你需要把这棵树划分成k个子树,每一个子树的权值是这棵子树上所有节点权值之和. 你要输出这k棵子树的权值中那个最大的.你需要让 ...

  3. BZOJ 4516. [Sdoi2016]生成魔咒【SAM 动态维护不同子串数量】

    [Sdoi2016]生成魔咒 动态维护不同子串的数量 想想如果只要查询一次要怎么做,那就是计算各个点的\(len[u]-len[link[u]]\)然后求和即可,现在要求动态更新,我们可以保存一个答案 ...

  4. SPOJ Favorite Dice(概率dp)

    题意: 一个骰子,n个面,摇到每一个面的概率都一样.问你把每一个面都摇到至少一次需要摇多少次,求摇的期望次数 题解: dp[i]:已经摇到i个面,还需要摇多少次才能摇到n个面的摇骰子的期望次数 因为我 ...

  5. Codeforces Round #582 (Div. 3) C. Book Reading

    传送门 题意: 给你n,k.表示在[1,n]这个区间内,在这个区间内找出来所有x满足x%k==0,然后让所有x的个位加到一起(即x%10),输出. 例如:输入10 2 那么满足要求的数是2 4 6 8 ...

  6. Codeforces Round #649 (Div. 2) B. Most socially-distanced subsequence (数学,差分)

    题意:有一长度为\(n\)的数组,求一子序列,要求子序列中两两差的绝对值最大,并且子序列尽可能短. 题解:将数组看成坐标轴上的点,其实就是求每个单调区间的端点,用差分数组来判断单调性. 代码: #in ...

  7. Nginx 服务介绍

    目录 静态 / 动态 Web 服务 Nginx 简介 Nginx 的优点 Nginx 和 Apache 的比较 Nginx 的安装 Nginx 相关文件 Nginx 主配置文件 Nginx 虚拟主机配 ...

  8. codeforces 2C(非原创)

    C. Commentator problem time limit per test 1 second memory limit per test 64 megabytes input standar ...

  9. AbstractQueuedSynchronizer解析

    AbstractQueuedSynchronizer简称为AQS,是juc里很基本的一个包,juc里很多工具类是基于AQS实现的,理解了AQS,其它很多juc工具类也会比较清楚了. 1.方法简述 ge ...

  10. codepen 上25个最受欢迎的HTML/CSS代码

    Codepen是一个非常了不起的网站,优设哥在设计师网址导航上也大力推荐过,得到了很多同学的喜爱,也是全球web前端开发人员的圣地! 我搜索了一些时下最好最流行的codepen(仅限于HTML和CSS ...