本文转自:疯狂的我  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的更多相关文章

  1. 【EF】CodeFirst Fluent API使用记录

    我们在使用EF CodeFirst 模式生成数据库的时候进行表的代码映射关系可以采用注解模式和Fluent API模式.这里就是记录一下使用Fluent API进行表关系映射的方法. 注解模式: 回顾 ...

  2. 第十八篇 .NET高级技术之Linq与EF Code-First Fluent API基础讲解

    1.FluentApi简介 在这里提供了一个fluentapi基础的DEMO然后咱们在进一步的学习,直接上干货. 第一步在数据库创建一个表:person 第二步:新建控制台程序FluentAPI 第三 ...

  3. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  4. 8.3 使用Fluent API进行属性映射【Code-First系列】

    现在,我打算学习,怎么用Fluent API来配置领域类中的属性. using System; using System.Collections.Generic; using System.Linq; ...

  5. 8.Fluent API in Code-First【Code-First系列】

    在前面的章节中,我们已经看到了各种不同的数据注解特性.现在我们来学习一下Fluent API. Fluent API是另外一种配置领域类的方式,它提供了更多的配置相比数据注解特性. Mappings[ ...

  6. 第十六节: EF的CodeFirst模式通过Fluent API修改默认协定

    一. 简介 1. 优先级:Fluent API > data annotations > default conventions. 2. 所有的Fluent API配置都要在 OnMode ...

  7. 17.翻译系列:将Fluent API的配置迁移到单独的类中【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/move-configurations-to-seperate-class-in-cod ...

  8. EntityFramework Code-First 简易教程(七)-------领域类配置之Fluent API

    Fluent API配置: 前面我们已经了解到使用DataAnotations特性来覆写Code-First默认约定,现在我们来学习Fluent API. Fluent API是另一种配置领域类的方法 ...

  9. 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 ...

随机推荐

  1. grunt之入门实践

    grunt 是基于nodejs的前端项目管理工具,凭借着大量优秀的插件从众多前端项目管理工具中脱颖而出. 确保先安装了nodejs 为了方便使用Grunt,应该在全局范围内安装Grunt的命令行接口( ...

  2. 从一个PHP数据生成 CSV 文件

    这的确是一个很简单的功能,从一个PHP数组生成一个.csv文件.此函数使用 fputcsv PHP 内置函数 <? function generateCsv($data, $delimiter ...

  3. HTML5实现的视频播放器01

    HTML5实现的视频播放器   什么是hivideo? 最近一段时间在使用PhoneGap开发一个App应用,App需要播放视频,本想直接使用html5的video,但使用它在全屏播放时不支持横屏播放 ...

  4. .net core3

  5. iOS触摸事件深度解析-备用

    概述 本文主要解析从我们的手指触摸苹果设备到最终响应事件的整个处理机制.本质上讲,整个过程可以分为两个步骤: 步骤1:找目标.在iOS视图层次结构中找到触摸事件的最终接受者: 步骤2:事件响应.基于i ...

  6. Leetcode_Best Time to Buy and Sell Stock

    Say you have an array for which the ith element is the price of a given stock on day i. If you were ...

  7. 自定义高级QFileDialog文件过滤器

    QFileDialog提供了一个函数---setproxyModel..就是用这个来玩了.就是override filterAcceptsRow的虚函数,里面定制自己的过滤需求.返回bool   下面 ...

  8. github如何删除一个repository(仓库)

    昨天有人问我如何删除自己创建的一个项目,我浏览了一下github网站,确实不太容易找到删除功能.这里介绍一下啊如何在github上删除一个repository 一:首先点击进入你要删除的reposit ...

  9. java.lang.ClassNotFoundException错误原因汇总

    开发java很长时间了,还经常会遇到java.lang.ClassNotFoundException这样的错误,最近又处理了一次,起初怀疑是jdk版本比class文件的编译版本低了导致了,但是运维人员 ...

  10. hdu1540-Tunnel Warfare (线段树区间合并)

    题意:n个村庄,有三种操作,D x 破坏位置为x的村庄,R 修复上一次被破坏的村庄,Q x 输出含有x村庄的连续村庄的最大个数.线段树搞之,区间合并. ls[maxn]为当前节点左面的连续区间,rs[ ...