【EF】EF框架 Code First Fluent API
在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系。
要使用Fluent API必须在构造自定义的DbContext时,重写OnModelCreating方法,在此方法体内调用Fluent API。
如下面代码所示:
public class BlogDbContext : DbContext{ public BlogDbContext(): base("name=BlogDB2005"){}protected override void OnModelCreating(DbModelBuilder modelBuilder){//do somethingbase.OnModelCreating(modelBuilder);}}
下面来看一些简单的例子
主键
modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId);
联合主键
//联合主键modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName });
字段非空
//要求属性必填 modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired();
设定字段最大长度
modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength(20);
设置复杂属性,相当数据特性中的ComplexType
modelBuilder.ComplexType<Address>();
属性字段不映射到数据表字段,相当于数据特性中的NotMapped
modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty);
设置字段是否自动增长
//设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.NonemodelBuilder.Entity<BlogUser>().Property(user => user.UserId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
设置外键
///产生一对多的关系modelBuilder.Entity<Post>().HasRequired(p =>p.BlogUser).WithMany(user => user.Posts).HasForeignKey(p => p.UserId);///与上面等效//modelBuilder.Entity<BlogUser>()// .HasMany(user => user.Posts)// .WithRequired(p => p.BlogUser)// .HasForeignKey(p => p.UserId);
设定实体映射到数据库中的表名
modelBuilder.Entity<BlogUser>().ToTable("MyUser");
设置实体属性映射到数据库中的列名
modelBuilder.Entity<BlogUser>().Property(user => user.Description).HasColumnName("userDescription").HasColumnType("ntext");
下面给出完整代码,方便测试:
1 class FluentAPISample 2 { 3 4 static void Main(string[] args) 5 { 6 using (var db = new BlogDbContext()) 7 { 8 db.Database.Create(); 9 } 10 } 11 } 12 13 public class BlogDbContext : DbContext 14 { 15 public BlogDbContext() 16 : base("name=BlogDB2005") 17 { 18 Database.SetInitializer<BlogDbContext>( 19 new DropCreateDatabaseIfModelChanges<BlogDbContext>() 20 ); 21 } 22 protected override void OnModelCreating(DbModelBuilder modelBuilder) 23 { 24 modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId); 25 //联合主键 26 //modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName }); 27 28 //设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.None 29 modelBuilder.Entity<BlogUser>().Property(user => user.UserId) 30 .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 31 32 //要求属性必填 33 modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired(); 34 modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength(20); 35 modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty); 36 37 modelBuilder.ComplexType<Address>(); 38 39 ///产生一对多的关系 40 modelBuilder.Entity<Post>() 41 .HasRequired(p =>p.BlogUser) 42 .WithMany(user => user.Posts) 43 .HasForeignKey(p => p.UserId); 44 45 ///与上面等效 46 //modelBuilder.Entity<BlogUser>() 47 // .HasMany(user => user.Posts) 48 // .WithRequired(p => p.BlogUser) 49 // .HasForeignKey(p => p.UserId); 50 51 modelBuilder.Entity<BlogUser>().ToTable("MyUser"); 52 53 modelBuilder.Entity<BlogUser>() 54 .Property(user => user.Description) 55 .HasColumnName("userDescription") 56 .HasColumnType("ntext"); 57 58 base.OnModelCreating(modelBuilder); 59 } 60 } 61 62 public partial class BlogUser 63 { 64 public int UserId { get; set; } 65 public string BlogName { get; set; } 66 public int MyProperty { get; set; } 67 public Address Address { get; set; } 68 public string Description { get; set; } 69 public virtual ICollection<Post> Posts { get; set; } 70 } 71 public partial class Post 72 { 73 public int PostId { get; set; } 74 public string PostTitle { get; set; } 75 public int UserId { get; set; } 76 public BlogUser BlogUser { get; set; } 77 } 78 public partial class Address 79 { 80 public string Province { get; set; } 81 public string City { get; set; } 82 }
1 class FluentAPISample 2 { 3 4 static void Main(string[] args) 5 { 6 using (var db = new BlogDbContext()) 7 { 8 db.Database.Create(); 9 } 10 } 11 } 12 13 public class BlogDbContext : DbContext 14 { 15 public BlogDbContext() 16 : base("name=BlogDB2005") 17 { 18 Database.SetInitializer<BlogDbContext>( 19 new DropCreateDatabaseIfModelChanges<BlogDbContext>() 20 ); 21 } 22 protected override void OnModelCreating(DbModelBuilder modelBuilder) 23 { 24 modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId); 25 //联合主键 26 //modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName }); 27 28 //设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.None 29 modelBuilder.Entity<BlogUser>().Property(user => user.UserId) 30 .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 31 32 //要求属性必填 33 modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired(); 34 modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength(20); 35 modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty); 36 37 modelBuilder.ComplexType<Address>(); 38 39 ///产生一对多的关系 40 modelBuilder.Entity<Post>() 41 .HasRequired(p =>p.BlogUser) 42 .WithMany(user => user.Posts) 43 .HasForeignKey(p => p.UserId); 44 45 ///与上面等效 46 //modelBuilder.Entity<BlogUser>() 47 // .HasMany(user => user.Posts) 48 // .WithRequired(p => p.BlogUser) 49 // .HasForeignKey(p => p.UserId); 50 51 modelBuilder.Entity<BlogUser>().ToTable("MyUser"); 52 53 modelBuilder.Entity<BlogUser>() 54 .Property(user => user.Description) 55 .HasColumnName("userDescription") 56 .HasColumnType("ntext"); 57 58 base.OnModelCreating(modelBuilder); 59 } 60 } 61 62 public partial class BlogUser 63 { 64 public int UserId { get; set; } 65 public string BlogName { get; set; } 66 public int MyProperty { get; set; } 67 public Address Address { get; set; } 68 public string Description { get; set; } 69 public virtual ICollection<Post> Posts { get; set; } 70 } 71 public partial class Post 72 { 73 public int PostId { get; set; } 74 public string PostTitle { get; set; } 75 public int UserId { get; set; } 76 public BlogUser BlogUser { get; set; } 77 } 78 public partial class Address 79 { 80 public string Province { get; set; } 81 public string City { get; set; } 82 }
运行结果如下图示:
【EF】EF框架 Code First Fluent API相关推荐
- EF CodeFirst 学习 1 - 用fluent API设置元数据,
用 Fluent API 设置元数据 http://agilenet.wordpress.com/2011/04/11/entity-framework-4-1-rc-with-an-existing ...
- 第十六节: EF的CodeFirst模式通过Fluent API修改默认协定
一. 简介 1. 优先级:Fluent API > data annotations > default conventions. 2. 所有的Fluent API配置都要在 OnMode ...
- 第六节:框架搭建之EF的Fluent Api模式的使用流程
一. 前言 沉寂了约一个月的时间,今天用一篇简单的文章重新回归博客,主要来探讨一下Fluent Api模式在实际项目中的使用流程. 1. Fluent API属于EF CodeFirst模式的一种,E ...
- .net ef 字段不区分大小写_第六节:框架搭建之EF的Fluent Api模式的使用流程
一. 前言 沉寂了约一个月的时间,今天用一篇简单的文章重新回归博客,主要来探讨一下Fluent Api模式在实际项目中的使用流程. 1. Fluent API属于EF CodeFirst模式的一种,E ...
- 使用 Fluent API 配置/映射属性和类型
配置EF使之在映射数据时绕开约定:注释和Fluent API.注释仅涵盖一部分Fluent API功能. 通过重写DbContext上的OnModelCreating方法来访问Code First F ...
- Fluent API
访问Fluent API 通常通过重写派生的 DbContext 上的 OnModelCreating 方法来访问 Code First Fluent API public class SchoolC ...
- EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射
为什么80%的码农都做不了架构师?>>> EF里的默认映射以及如何使用Data Annotations和Fluent API配置数据库的映射 I.EF里的默认映射 上篇文章演示 ...
- EF中的Code First
一些概念 POCO POCO(Plain Old CLR Object)的概念是从java的POJO借用而来,而两者的含义是一致的,不同的仅仅是使用的语言不一样.所以POCO的解释就是"P ...
- ef power tools mysql_使用 EF Power Tool Code Frist 生成 Mysql 实体
使用 EF Power Tool Code Frist 生成 Mysql 实体 1,在要生成的项目上右键 2, 3, 4, 5, 生成后的效果 已知问题: 1,在Mysql数据表中 tinyint( ...
- BIM工程信息管理系统-EF实体框架数据操作基类
EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// & ...
最新文章
- 双模sa_2020年5G终端发展展望:NSA/SA双模终端将成市场“主力军”!
- 信息抽取(五)实体命名识别之嵌套实体识别哪家强,我做了一个简单的对比实验
- 信息学奥赛一本通(1060:均值)
- jQuery常用属性过滤选择器
- COM06-Can通信协议栈架构【最高峰】
- premiere cc2014破解版|premiere cc2014绿色破解版下载
- easypoi必填项_easypoi必填项_EasyPoi使用入门
- 启动优化 · 基础论 · 浅析Android启动优化
- 微生物组-扩增子16S分析和可视化(线上/线下同时开课,2022.4)
- java doc转换docx_JAVA - 将doc文档转为docx文档
- unity动态加载obj文件
- 众人逃离北上广后又逃回:观念不合拍还要拼爹
- 小程序中css实现镜像功能
- 最小生成树——Prim算法
- reverse方法(自己实现)
- 洛谷题单1-7 搜索题解
- 时间片(time-slicing)轮循调度(round-robin scheduling)
- Thunderbird 里面 QQ 企业邮箱 POP3/SMTP 设置
- 速卖通小伙伴们,关于欧盟VAT税改最全面解读,杭州海赢科技分享!
- 递推算法之数字三角形求和问题