【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 something
base.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.None
modelBuilder.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");
下面给出完整代码,方便测试:
class FluentAPISample
{ static void Main(string[] args)
{
using (var db = new BlogDbContext())
{
db.Database.Create();
}
}
} public class BlogDbContext : DbContext
{
public BlogDbContext()
: base("name=BlogDB2005")
{
Database.SetInitializer<BlogDbContext>(
new DropCreateDatabaseIfModelChanges<BlogDbContext>()
);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId);
//联合主键
//modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName }); //设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.None
modelBuilder.Entity<BlogUser>().Property(user => user.UserId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); //要求属性必填
modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired();
modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength();
modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty); modelBuilder.ComplexType<Address>(); ///产生一对多的关系
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"); base.OnModelCreating(modelBuilder);
}
} public partial class BlogUser
{
public int UserId { get; set; }
public string BlogName { get; set; }
public int MyProperty { get; set; }
public Address Address { get; set; }
public string Description { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
public partial class Post
{
public int PostId { get; set; }
public string PostTitle { get; set; }
public int UserId { get; set; }
public BlogUser BlogUser { get; set; }
}
public partial class Address
{
public string Province { get; set; }
public string City { get; set; }
}
class FluentAPISample
{ static void Main(string[] args)
{
using (var db = new BlogDbContext())
{
db.Database.Create();
}
}
} public class BlogDbContext : DbContext
{
public BlogDbContext()
: base("name=BlogDB2005")
{
Database.SetInitializer<BlogDbContext>(
new DropCreateDatabaseIfModelChanges<BlogDbContext>()
);
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<BlogUser>().HasKey(user => user.UserId);
//联合主键
//modelBuilder.Entity<BlogUser>().HasKey(user => new { user.UserId, user.BlogName }); //设置自动增长,如不需要自动增长,则设为 DatabaseGeneratedOption.None
modelBuilder.Entity<BlogUser>().Property(user => user.UserId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); //要求属性必填
modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).IsRequired();
modelBuilder.Entity<BlogUser>().Property(user => user.BlogName).HasMaxLength();
modelBuilder.Entity<BlogUser>().Ignore(user => user.MyProperty); modelBuilder.ComplexType<Address>(); ///产生一对多的关系
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"); base.OnModelCreating(modelBuilder);
}
} public partial class BlogUser
{
public int UserId { get; set; }
public string BlogName { get; set; }
public int MyProperty { get; set; }
public Address Address { get; set; }
public string Description { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
public partial class Post
{
public int PostId { get; set; }
public string PostTitle { get; set; }
public int UserId { get; set; }
public BlogUser BlogUser { get; set; }
}
public partial class Address
{
public string Province { get; set; }
public string City { get; set; }
}
运行结果如下图示:

【EF】EF框架 Code First Fluent API的更多相关文章
- EF框架step by step(9)—Code First Fluent API
		
在上一篇中,讲述了用数据特性的方式来标识实体与数据表之间的映射关系,在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系. 要使用Fluent API必须 ...
 - EF的注解Annotation和Fluent API
		
注意:Annotation特性标记可组合使用,也就是在一个类或属性上可以附加多个annotations特性 一.常用注解和对应的Fluent API 1.[Required] ...
 - EF——使用Data Annotations和Fluent API配置数据库的映射配置 02.01(转)
		
要更改EF中的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面;还有一个就 ...
 - EF Code-First 学习之旅 Fluent API
		
Mappings To Database Model-wide Mapping Set default Schema Set Custom Convetions Entity Mapping To S ...
 - 第十六节: EF的CodeFirst模式通过Fluent API修改默认协定
		
一. 简介 1. 优先级:Fluent API > data annotations > default conventions. 2. 所有的Fluent API配置都要在 OnMode ...
 - .net core 2.0 Code First Fluent API配置
		
A.net core 2.0新特性支持通过IEntityTypeConfiguration<>添加Code First配置到一个封装类. 新建目标框架为.NET Core类库 新建完了以后 ...
 - 第六节:框架搭建之EF的Fluent Api模式的使用流程
		
一. 前言 沉寂了约一个月的时间,今天用一篇简单的文章重新回归博客,主要来探讨一下Fluent Api模式在实际项目中的使用流程. 1. Fluent API属于EF CodeFirst模式的一种,E ...
 - 10.2.翻译系列:使用Fluent API进行属性映射【EF 6 Code-First】
		
原文链接:https://www.entityframeworktutorial.net/code-first/configure-property-mappings-using-fluent-api ...
 - EF Core中通过Fluent API完成对表的配置
		
EF Core中通过Fluent API完成对表的配置 设置实体在数据库中的表名 通过ToTable可以为数据模型在数据库中自定义表名,如果不配置,则表名为模型名的复数形式 public class ...
 
随机推荐
- # 20155224 实验四 Android程序设计
			
20155224 实验四 Android程序设计 任务一 Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for And ...
 - 20155318 《Java程序设计》实验二 (Java面向对象程序设计)实验报告
			
20155318 <Java程序设计>实验二 (Java面向对象程序设计)实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...
 - 《Java程序设计》课堂实践内容总结
			
<Java程序设计>课堂实践内容总结 实践一 要求 修改教材P98 Score2.java, 让执行结果数组填充是自己的学号: 提交在IDEA或命令行中运行结查截图,加上学号水印,没学号的 ...
 - 浅入tcp
			
1.认识TCP tcp协议是传输层协议,它的最主要的3个特点是面向连接.可靠保证.基于字节流.当应用层把数据给tcp层时,注意如果数据大于MSS是要在tcp层进行分段的.tcp协议为了保证不丢包会给每 ...
 - pyqt5 菜单,工具栏,线程,matplotlib
			
import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QMainWindow, QMenuBar, QToolBar ...
 - 9.14 DP合集水表
			
9.14 DP合集水表 关键子工程 在大型工程的施工前,我们把整个工程划分为若干个子工程,并把这些子工程编号为 1. 2. --. N:这样划分之后,子工程之间就会有一些依赖关系,即一些子工程必须在某 ...
 - 第五章Web应用与应用层协议
			
Web应用与应用层协议 本篇博文中的主要参考文献是<计算机网络高级教程>,分别是吴功宜老先生和吴英教授合著.这部教程是我研究生老师所推荐的网络必读科目,由于该教程讲解的基础知识详细,但内容 ...
 - sqli-labs学习笔记 DAY2
			
DAY2 sqli-labs lesson 2 手工注入 URL:http://localhost/sqli-labs-master/Less-2/ Parameter:id 注入点检测:id=2;– ...
 - 微信小程序-----自定义验证码实现
			
这一段时间做小程序项目,使用的是mpvue的框架,需要自己实现验证码输入,模拟input的光标,上一个框输入后后一个框自动获取焦点,删除时从后往前依次删除.下图是整体效果: <template& ...
 - ES6的新特性(11)——Class 的继承
			
Class 的继承 简介 Class 可以通过extends关键字实现继承,这比 ES5 的通过修改原型链实现继承,要清晰和方便很多. class Point { } class ColorPoint ...