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 ...
随机推荐
- oracle commit之后的数据回滚
当你晕晕乎乎的执行了commit之后,突然间意思到自己点错了,那说明你和我碰到了一样的问题. 瞬间感觉大冷天头顶冒汗,那就说明你的感觉对了.废话少说,下面是我的办法: 下面的例子都是以Test表为例. ...
- dbutils的使用Demo
首先了解一下 Queryrunner.query —————只可以执行select语句. Queryrunner.update —————只可以接收update,delte,insert语句 ...
- window程序设计1
int WINAPI WinMain(HINSTANCE HInstance,HINSTANCE HPreInstance,LPSTR szCmdLine,int CmdShown) { Massag ...
- 使用ffmpeg录音
官方教程:http://ffmpeg.org/ffmpeg.html 录音方法: 开始找到了这个方法,但是不行呀,好像是没有这个oss吧. oss 是linux 下的声音相关的东西,与alsa 一样, ...
- 转自http://blog.slogra.com/post-13.html,关闭centos虚拟机的蜂鸣声
相信对经常在虚拟机做实验的人来说,每次按tab来补全命令的时候是最痛苦的,这个时候是最让人想把 电脑的蜂鸣器给拆下来,让我们来关闭这个烦人的东西吧. 在centos系统下的方法 1.临时解决办法:以 ...
- jquery easyui+layer后台框架
最近使用jquery easyui搭建了一个后台框架,以方便以后使用 上图先: 下载地址:CSDN下载
- 使用PowerDesigner 15对现有数据库进行反向工程(图解教程)
1.启动PD 2.菜单:File->Reverse Engineer ->Database 出来New Physical Data Model对话框 点击“确定”按钮,弹出Database ...
- Python 一路走来 Django
Web 框架 (本质:socket) Python web框架 自己实现socket - Tornado 基于wsgi ...
- Python 多线程 队列 示例
Python3,开一个线程,间隔1秒把一个递增的数字写入队列,再开一个线程,从队列中取出数字并打印到终端 #! /usr/bin/env python3 import time import thre ...
- 智能卡 ATR解析
如果终端不支持IC卡支持的其它传输协议以及传输参数值,IC卡应该有能力用基本ATR定义的模式和终端进行交互. 终端如果无法满足IC卡回送ATR中定义的传输模式,将发送一个热复位信号,或将IC卡置为静止 ...