CodeFirst Fluent API
本文转自:疯狂的我 CodeFirst Fluent API
EF的好处之一就是实现了概念模型和存储模型的分离,我们可以为概念实体和存储实体起不同的名称,同时还可以将一个概念实体映射到多个存储实体,实现实体之间一对多或多对多的关系。
在CodeFirst里面为了处理这种概念实体和存储实体的对应关系,因此Fluent API就出现了。
下面就开始介绍Fluent API
先设置概念实体类
public class Blog { public int Id { get ; set ; } public int BlogId { get ; set ; } public string Title { get ; set ; } public string BloggerName { get ; set ; } public string Test { get ; set ; } public virtual ICollection<Post> Posts { get ; set ; } } public class Post { public int Id { get ; set ; } public string Content { get ; set ; } public int FKBlogId { get ; set ; } public Blog Blog { get ; set ; } public ICollection<Comment> Comments { get ; set ; } } public class Comment { public int Id { get ; set ; } public string Content { get ; set ; } public ICollection<Post> Posts { get ; set ; } } |
第一步 创建类BlogContext 派生于 DbContext 重写里面的方法 OnModelCreating
public class BlogContext : DbContext { public DbSet<Blog> Blogs { get ; set ; } public DbSet<Post> Posts { get ; set ; } public DbSet<Comment> Comments { get ; set ; } public DbSet<Supplier> Suppliers { get ; set ; } public class BlogContextInitializer : DropCreateDatabaseIfModelChanges<BlogContext> { protected override void Seed(BlogContext context) { base .Seed(context); } } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base .OnModelCreating(modelBuilder); } } |
第二步 实现概念模型和存储模型之间的映射
1、给表Blog设置主键
注:如果没有给实体设置主键,那么EF会默认的设置ID或者[类名+ID]的列为主键,如果两个都存在,EF则会以ID为主键
modelBuilder.Entity<Blog>().HasKey(c=>c.Id); |
2、概念实体映射到存储实体的实体名改变
modelBuilder.Entity<Blog>().ToTable( "Blog" , "Blogs" ); |
3、给存储模型设置别名,EF的强大之处在于概念模型和存储模型对应的字段的名称可以不一样,但它还能认识,我估计是以键对值的方式在存储别名
modelBuilder.Entity<Blog>().Property(t => t.Test).HasColumnName( "TestName" ); |
4、设置实体之间一对多的关系 同时指定了Blog的外键:FK_BlogId
modelBuilder.Entity<Post>().HasRequired(p => p.Blog) .WithMany(b => b.Posts) .HasForeignKey(p => p.FK_BlogId); |
5、设置实体之间多对多的关系 实现多对多的关系是建立一张两表对应的关系表
modelBuilder.Entity<Post>().HasMany(p => p.Comments) .WithMany(c => c.Posts).Map(mc => { mc.ToTable( "ComtentToPost" ); mc.MapRightKey( "CommentId" ); mc.MapLeftKey( "PostId" ); }); |
6、设置存储实体的字段为非空类型
modelBuilder.Entity<Blog>().Property(c => c.Title).IsRequired(); |
7、设置字段长度
modelBuilder.Entity<Blog>().Property(c => c.Title).HasMaxLength(12); |
8、设置字段类型
modelBuilder.Entity<Blog>().Property(c => c.BloggerName).HasColumnType( "varchar" ); |
这里列出了Fluent API 常用的几个。以后学习新东西的会坚持写博客,这样不仅对所学知识进行梳理,也能加强自身印象。
CodeFirst Fluent API的更多相关文章
- 【EF】CodeFirst Fluent API使用记录
我们在使用EF CodeFirst 模式生成数据库的时候进行表的代码映射关系可以采用注解模式和Fluent API模式.这里就是记录一下使用Fluent API进行表关系映射的方法. 注解模式: 回顾 ...
- 第十八篇 .NET高级技术之Linq与EF Code-First Fluent API基础讲解
1.FluentApi简介 在这里提供了一个fluentapi基础的DEMO然后咱们在进一步的学习,直接上干货. 第一步在数据库创建一个表:person 第二步:新建控制台程序FluentAPI 第三 ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- 8.3 使用Fluent API进行属性映射【Code-First系列】
现在,我打算学习,怎么用Fluent API来配置领域类中的属性. using System; using System.Collections.Generic; using System.Linq; ...
- 8.Fluent API in Code-First【Code-First系列】
在前面的章节中,我们已经看到了各种不同的数据注解特性.现在我们来学习一下Fluent API. Fluent API是另外一种配置领域类的方式,它提供了更多的配置相比数据注解特性. Mappings[ ...
- 第十六节: EF的CodeFirst模式通过Fluent API修改默认协定
一. 简介 1. 优先级:Fluent API > data annotations > default conventions. 2. 所有的Fluent API配置都要在 OnMode ...
- 17.翻译系列:将Fluent API的配置迁移到单独的类中【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/move-configurations-to-seperate-class-in-cod ...
- EntityFramework Code-First 简易教程(七)-------领域类配置之Fluent API
Fluent API配置: 前面我们已经了解到使用DataAnotations特性来覆写Code-First默认约定,现在我们来学习Fluent API. Fluent API是另一种配置领域类的方法 ...
- 10.翻译系列:EF 6中的Fluent API配置【EF 6 Code-First系列】
原文链接:https://www.entityframeworktutorial.net/code-first/fluent-api-in-code-first.aspx EF 6 Code-Firs ...
随机推荐
- effective_c++条款20,用pass-by-reference-to-const替换pass-by-value
pass-by-value void f(A a); 1)导致复制是浪费资源 2)多态是导致对象切割 所以我们使用 void f(const A& a) 上面的话针对class,不针对基本类型 ...
- C/C++中字符串存储位置
代码: #include <iostream> #include <cstdio> using namespace std; void fun(char **p){ //cha ...
- CSS应用二
样式中的顺序问题. 如:padding,margin,border,等,都是按照顺时针方向赋值的,及上右下左. Padding:1px 2px 3px 4px;(top:1px;right:2px;b ...
- Android MVP模式 简单易懂的介绍方式
主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200
- linux系统时间和硬件时钟问题(date和hwclock)
http://blog.chinaunix.net/uid-182041-id-3464524.html http://blog.csdn.net/duyiwuer2009/article/detai ...
- KEIL UV3中光标不对齐解决
Keil uVision3与uV2相比增加了对更多型号单片机的支持,另外还对一些的方面进行了优化.不过它却优化出一个让人头疼的问题,那就是光标位置显示不正确!这一问题给程序的编写带来了许多不便.不过不 ...
- 【操作系统】进程间通信(C#)
原文:[操作系统]进程间通信(C#) 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xia ...
- zabbix如何选择适合的监控类型(107)
zabbix agent zabbix自带的客户端程序(被动模式),zabbix server主动向它收集监控数据.agent提供丰富的key,包括不限于cpu.内存.网络.磁盘.web等等.如果你不 ...
- translate函数说明
TRANSLATE(expr, from_string, to_string) from_string 与 to_string 以字符为单位,对应字符一一替换. SQL> SELECT TRAN ...
- Delphi TcxTreelist 设置scrollbars 不起作用的原因
最近设置TcxTreelist的滚动条,发现水平的不起作用, 即使设置 sboth也不起作用. 查找,发现设置的一些属性导致了这个原因, 建立备忘,如下图: 1.属性, 这个页面,设置的表格,怎么也看 ...