本文转自:疯狂的我  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. iOS 使用GitHub托管代码(github desktop使用)

    iOS 使用GitHub托管代码 代码托管 1.首先得有一个GitHub的账号,没有的话就去https://github.com注册一个吧. 2.下载GitHub Mac客户端:http://mac. ...

  2. js 获取mac地址

    js 获取mac地址 function MacInfo(){ var locator =new ActiveXObject ("WbemScripting.SWbemLocator" ...

  3. h5connect.js 腾讯云视频点播使用指南

    http://video.qcloud.com/download/docs/QVOD_Player_Web_SDK_Developer_Guide.pdf 腾讯云视频点播服务 Web播放器SDK开发指 ...

  4. .h文件和.cpp文件

    //新建如图文件 //在头文件.h中声明,在.cpp中实现 //main.cpp代码如下 #define _CRT_SECURE_NO_WARNINGS #include<iostream> ...

  5. ssm+jsp+自定义标签实现分页,可以通用(前端实现)

    近期做了一些分页方面的开发,大致梳理一下 1 jsp页面上关于分页的代码 <tr> <td colspan="9"> <ule1:pagination ...

  6. 【转】sublime text 2 中文乱码解决办法

    sublime text 2是一款非常优秀的跨平台文本及源代码编辑器,本人非常喜欢,但是不支持GB2312和GBK编码在某些时候比较麻烦.可以通过向sublime text 中添加编码类型转换包(比如 ...

  7. vim 折叠代码技巧汇总

    以下命令输入的方式: 如zo命令,先按z键,松开后按o键即可展开折叠. 一.打开.关闭折叠 zo 展开折叠,只展开最外层的折叠. zO 对所在范围内所有嵌套的折叠点展开,包括嵌套折叠. zc 折叠,只 ...

  8. Codeforces 13C Sequence

    http://codeforces.com/contest/13/problem/C 题目大意 给定一个含有N个数的序列,要求你对一些数减掉或者加上某个值,使得序列变为非递减的,问你加减的值的总和最少 ...

  9. PowerShell 字符串操作符

    字符串操作符 格式化操作符 –F 在PowerShell文本操作符中非常重要,经常被用来增强数字类型和日期类型的可读性: "{0} diskettes per CD" -f (72 ...

  10. 函数call相关[ASM]

    前言:   __cdecl:C/C++函数默认调用约定,参数依次从右向左传递,并压入堆栈,最后由调用函数清空堆栈,这种方式适用于传递参数个数可变的被调用函数,只有被调用函数才知道它传递了多少个参数给被 ...