EFCodeFirst属性映射约定
EFCodeFirst属性映射约定
CodeFirst与数据表之间得映射方式又两种:Data Annotation和Fluent API
默认约定:
表名为类名的复数。
创建表得所有者为dbo。
int类型属性映射成数据库int类型。
string类型属性映射成数据库NVARCHAR类型。
若类的字符串类型属性未设置MaxLength,则生成对应的列类型为NVARCHAR(MAX)。
默认主键约束:属性名为[ID]或[类名 + ID]
对于int类型主键,会自动增长。
1 自定义映射表名以及所有者
Data Annotation
- //必要引用
- using System.ComponentModel.DataAnnotations.Schema;
- //映射表名
- [Table("Product")]
- public class Product
- //映射表名以及所有者
- [Table("Product", Schema = "dbo")]
- public class Product
Fluent API方式
- //重写OnModelCreating方法实现 映射表名
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().ToTable("Product");
- }
- //重写OnModelCreating方法实现 映射表名以及所有者
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().ToTable("Product", "dbo");
- }
2.字段名、长度、数据类型及是否可空
Data Annotation
- //映射列名
- [Column("ProductID")]
- public int ProductID { get; set; }
- //映射列名,长度,是否为空
- [MaxLength(100)]
- [Required, Column("ProductName")]
- public string ProductName { get; set; }
- //指定映射的数据类型
- [Column("UnitPrice", TypeName = "MONEY")]
- public decimal UnitPrice { get; set; }
- //设置Text
- [Column("Remark", TypeName = "text")]
- public string Remark { get; set; }
Fluent API方式
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- //映射列名
- modelBuilder.Entity<Product>().Property(t => t.ProductID)
- .HasColumnName("ProductID");
- //映射列名,是否为空,最大长度
- modelBuilder.Entity<Product>().Property(t => t.ProductName)
- .IsRequired()
- .HasColumnName("ProductName")
- .HasMaxLength(100);
- }
- //指定映射的数据类型
- modelBuilder.Entity<Product>().Property(t => t.UnitPrice)
- .HasColumnName("UnitPrice")
- .HasColumnType("MONEY");
- //设置Text
- modelBuilder.Entity<Category>().Property(t => t.Remark)
- .HasColumnName("Remark")
- .HasColumnType("text");
3.主键
Data Annotation
- [Key]
- [Column("ProductID")]
- public int ProductID { get; set; }
Fluent API方式
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().HasKey(t => t.ProductID);
- }
- //多主键
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().HasKey(t => new { t.KeyID, t.CandidateID });
- }
4.数据库自动生成字段值
Data Annotation
- //取消int类型主键自动增长
- [Key]
- [Column("ProductID")]
- [DatabaseGenerated(DatabaseGeneratedOption.None)]
- public int ProductID { get; set; }
- [Key]
- [Column("CategoryID")]
- [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
- public int CategoryID { get; set; }
Fluent API方式
- //取消int类型主键自动增长
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().HasKey(t => t.ProductID);
- modelBuilder.Entity<Product>().Property(t => t.ProductID)
- .HasColumnName("ProductID")
- .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
- }
- modelBuilder.Entity<Category>().ToTable("Category", "dbo");
- modelBuilder.Entity<Category>().HasKey(t => t.CategoryID);
- modelBuilder.Entity<Category>().Property(t => t.CategoryID)
- .HasColumnName("CategoryID")
- .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
- }
5.数字类型长度及精度
Fluent API方式
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().Property(t => t.UnitPrice)
- .HasColumnName("UnitPrice")
- .HasPrecision(18, 2);
- }
6.非数据库字段属性
Data Annotation
- [NotMapped]
- public string Remark { get; set; }
Fluent API方式
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Entity<Product>().Ignore(t => t.Remark);
- }
7.Fluent API配置Configuration映射类
方便维护
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.ComponentModel.DataAnnotations.Schema;
- using System.Data.Entity.ModelConfiguration;
- using Portal.Entities;
- namespace Portal.Mapping
- {
- public class ProductMap : EntityTypeConfiguration<Product>
- {
- public ProductMap()
- {
- // Primary Key
- this.HasKey(t => t.ProductID);
- // Properties
- this.Property(t => t.ProductID)
- .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
- this.Property(t => t.ProductName)
- .IsRequired()
- .HasMaxLength(100);
- // Table & Column Mappings
- this.ToTable("Product");
- this.Property(t => t.ProductID).HasColumnName("ProductID");
- this.Property(t => t.ProductName).HasColumnName("ProductName");
- this.Property(t => t.UnitPrice)
- .HasColumnName("UnitPrice")
- .HasPrecision(18, 2);
- }
- }
- }
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- modelBuilder.Configurations.Add(new ProductMap());
- }
EFCodeFirst属性映射约定的更多相关文章
- EFCodeFirst关系映射约定
EFCodeFirst关系映射约定 EFCodeFirst 关系映射约定 默认多重关系的一些约定规则: 1.一对多关系 两个类中分别包含一个引用和一个集合属性. 两个类中一个类包含另一个类的引用属性. ...
- Entity Framework Code First属性映射约定
Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...
- 【EF】Entity Framework实现属性映射约定
Entity Framework Code First属性映射约定中“约定”一词,在原文版中为“Convention”,翻译成约定或许有些不好理解,这也是网上比较大多数的翻译,我们就当这是Entity ...
- 补习知识:Entity Framework Code First属性映射约定
Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API.本文中采用创建Product类为例来说明tity Fram ...
- Entity Framework Code First属性映射约定 转载https://www.cnblogs.com/libingql/p/3352058.html
Entity Framework Code First属性映射约定 Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Flue ...
- Entity Framework实现属性映射约定
Entity Framework Code First属性映射约定中“约定”一词,在原文版中为“Convention”,翻译成约定或许有些不好理解,这也是网上比较大多数的翻译,我们就当这是Entity ...
- EntityFramework Core 2.1重新梳理系列属性映射(一)
前言 满血复活啦,大概有三个月的时间没更新博客了,关于EF Core最新进展这三个月也没怎么去看,不知现阶段有何变化没,本文将以EF Core 2.1稳定版本作为重新梳理系列,希望对看本文的你有所帮助 ...
- 10.2.翻译系列:使用Fluent API进行属性映射【EF 6 Code-First】
原文链接:https://www.entityframeworktutorial.net/code-first/configure-property-mappings-using-fluent-api ...
- Hibernate持久化类属性映射
Hibernate充当应用程序和数据库之间的中间件,实现二者之间的交互操作,他对JDBC进行了封装,以完全面向对象的方式来操作数据. 适用于有多个数据源的情况下,不必去考虑不同数据源的操作差异. Hi ...
随机推荐
- django开发东京买菜,全栈项目,前端vue,带手机GPS精准定位,带发票系统,带快递系统,带微信/支付宝/花呗/银行卡支付/带手机号一键登陆,等等
因为博客园不能发视频,所以,完整的视频,开发文档,源码,请向博主索取 完整视频+开发文档+源码,duanshuiLu.com下载 vue+django手机购物商城APP,带支付,带GPS精准定位用户, ...
- 动态规划TG.lv(1) (洛谷提高历练地)
动态规划TG.lv(1) P1005 矩阵取数游戏 分析:每行不超过80个数字,直接区间DP即可,\(dp[i][j]\)表示区间\([i,j]\)之间取数可以得到的答案,每次向右或者向左扩展即可.但 ...
- 「SCOI2005」互不侵犯 (状压DP)
题目链接 在\(N\times N\) 的棋盘里面放 \(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8\) 个格子 ...
- Codeforces Round #657 (Div. 2) C. Choosing flowers(贪心)
题目链接:https://codeforces.com/contest/1379/problem/C 题意 有 $m$ 种花,每种花数量无限,第一次购买一种花收益为 $a_i$,之后每一次购买收益为 ...
- Equal Numbers Gym - 101612E 思维
题意: 给你n个数vi,你有k次操作.每一次操作你可以从n个数里面挑一个数,然后使得这个数乘于一个正整数.操作完之后,这n个数里面不同数的数量就是权值.你要使得这个值尽可能小. 题解: 如果a%b== ...
- Smith Numbers POJ - 1142 暴力递归枚举
题意: 给你一个数x,把这个分解成素数之积(假设是x1*x2*x3),如果 x的每一数位的和 等于 x1每一数位的和加上x2每一数位的和加上x3每一数位的和,那么他就是题目要找的数 示例: ...
- nuoyanli 520 Let‘s play computer game
H题 描述 xxxxxxxxx在疫情期间迷上了一款游戏,这个游戏一共有nnn个地点(编号为1--n1--n1--n),他每次从一个地点移动到另外一个地点需要消耗 一定的能量,每一个地点都有一些珠宝,输 ...
- ubuntu 16.04 i386 安装 ruby + bundler + rails ; 搭建简单的网站bitbar
参考 http://gorails.com/setup/ubuntu/16.04 概述 Project 2 主要探究对web的攻击,本次试验共有6个部分. Project 2中攻击的是一个提供电子货币 ...
- Pymongo 笔记
Pymongo 1.MongoDB概念 MongoDB是一种非关系型数据库(NoSQL),MongoDB数据存储于内存,内存不足则将热度低数据写回磁盘.存储的数据结构为文档.每个数据库包含若干集合(c ...
- web 存储方式汇总:Cookies,Session, Web SQL; Web Storage(LocalStorage ,SessionStorage),IndexedDB,Application Cache,Cache Storage
1 1 1 web 存储方式汇总: 旧的方式: Cookies; Session; Web SQL; 新的方式 HTML5 : Web Storage(LocalStorage ,SessionSto ...