FluentApi配置存储过程

1.EF自动生成存储过程

  EF6的CodeFirst开发模式支持给实体的CUD操作配置存储过程,当我们执行SaveChanges()方法时EF不在生成INSERT,UPDATE,DELETE命令,而是生成CUD操作的存储过程,我们也可以给实体CUD操作指定自定义的存储过程。

一个栗子:

我们给学生实体的CUD操作设置存储过程,Student实体如下:

  1. class Student
  2. {
  3. public int StudentId { get; set; }
  4. public string StudentName { get; set; }
  5. public DateTime BirthDay { get; set; }
  6. }

使用MapToStoredProcedures()方法可以让实体的CUD操作通过存储过程实现(这些存储过程由EF API自动生成),使用代码如下:

  1. public class SchoolContext: DbContext
  2. {
  3. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  4. {
  5. modelBuilder.Entity<Student>()
  6. //.MapToStoredProcedures();
  7. }
  8.  
  9. public DbSet<Student> Students { get; set; }
  10. }

运行一下代码:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. using (SchoolContext context=new SchoolContext())
  6. {
  7. //记录发往数据库的命令
  8. context.Database.Log = Console.Write;
  9. //添加
  10. Student stu1 = new Student() { StudentName = "Jack", Birthday = DateTime.Now.AddYears(-) };
  11. context.Students.Add(stu1);
  12. context.SaveChanges();
  13. //修改
  14. stu1.StudentName = "Tom";
  15. context.SaveChanges();
  16. //删除
  17. context.Students.Remove(stu1);
  18. context.SaveChanges();
  19. }
  20. }
  21. }

运行结果如下:

如果取消上边代码中MapToStoredProcedures()方法的注释,那么运行后数据库添加了如下的存储过程:

程序运行结果如下:

2.给实体配置自定义存储过程

EF6中允许我们使用自定义存储过程并将其映射到对应的实体。我们也可以配置存储过程的参数。一个简单的栗子:

  1. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  2. {
  3. modelBuilder.Entity<Student>()
  4. .MapToStoredProcedures(p => p.Insert(sp => sp.HasName("sp_InsertStudent").Parameter(pm => pm.StudentName, "name").Result(rs => rs.StudentId, "Id"))
  5. .Update(sp => sp.HasName("sp_UpdateStudent").Parameter(pm => pm.StudentName, "name"))
  6. .Delete(sp => sp.HasName("sp_DeleteStudent").Parameter(pm => pm.StudentId, "Id"))
  7. );
  8. }

上边的代码将Student实体的CUD操作分别映射到sp_InsertStudentsp_UpdateStudentand sp_DeleteStudent三个存储过程,同时也配置了存储过程参数和实体属性间的映射。

3.给所有实体配置存储过程

  我们可以将所有实体的CUD操作都配置为存储过程形式的,使用如下代码就可以轻松实现:

  1. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  2. {
  3. modelBuilder.Types().Configure(t => t.MapToStoredProcedures());
  4. }

注意:只用FluentApi可以配置存储过程的映射,数据注释属性不支持配置存储过程。我们配置实体CUD的存储过程时要一起配置,只配置三个操作中的一个是不允许的。

EF CodeFirst系列(7)---FluentApi配置存储过程的更多相关文章

  1. EF CodeFirst系列(6)---配置1对1,1对多,多对多关系

    这一节介绍EF CodeFirst模式中的1对0/1,1对多,多对多关系的配置,只有梳理清楚实体间的关系,才能进行愉快的开发,因此这节虽然很简单但是还是记录了一下. 1. 1对0/1关系配置 1. 通 ...

  2. EF CodeFirst系列(3)---EF中的继承策略(暂存)

    我们初始化数据库一节已经知道:EF为每一个具体的类生成了数据库的表.现在有了一个问题:我们在设计领域类时经常用到继承,这能让我们的代码更简洁且容易管理,在面向对象中有“has  a”和“is a”关系 ...

  3. EF CodeFirst系列(8)--- FluentApi配置单个实体

    我们已经知道了在OnModelCreating()方法中可以通过FluentApi对所有的实体类进行配置,然而当实体类很多时,我们把所有的配置都放在OnModelCreating()方法中很难维护.E ...

  4. EF CodeFirst系列(5)---FluentApi

    FluentApi总结 1.FluentApi简介 EF中的FluentApi作用是通过配置领域类来覆盖默认的约定.在EF中,我们通过DbModelBuilder类来使用FluentApi,它的功能比 ...

  5. 6.Configure Domain Classes(配置领域类)【EF Code-First 系列】

    在前面的部分中,我们学习了Code-First默认约定,Code-First使用默认的约定,根据你的领域类,然后生成概念模型. Code-First模式,发起了一种编程模式:约定大于配置.这也就是说, ...

  6. EF CodeFirst系列(9)---添加初始化数据和数据库迁移策略

    1.添加初始化数据(Seed) 我们可以在初始化数据库的过程中给数据库添加一些数据.为了实现初始化数据(seed data)我们必须创建一个自定义的数据库初始化器(DB initializer),并重 ...

  7. 2.简单的Code First例子(EF Code-First系列)

    现在假想,我们想要为讴歌学校创建一个应用程序,这个程序需要能够来添加或者更新学生,分数,教师还有课程信息. 代替之前我们的做法:先是创建数据库,现在我们不这么做,我们先来创建领域类,首先我来创建两个简 ...

  8. 3.Code-First 约定(EF Code-First系列)

    前面,我们已经了解了Code-First利用领域类,怎么为我们创建数据库的简单示例.现在我们来学习一下Code-First约定吧. 什么是约定 约定说白了,就是基于一套规矩办事,这里就是基于你定义好的 ...

  9. EF CodeFirst系列(1)---CodeFirst简单入门

    1.什么是CodeFirst 从EF4.1开始,EF可以支持CodeFirst开发模式,这种开发模式特别适用于领域驱动设计(Domain Driven Design,大名鼎鼎的DDD).在CodeFi ...

随机推荐

  1. python3字符串格式化format()函数的简单用法

    format()函数 """ 测试 format()函数 """ def testFormat(): # format()函数中有几个元素, ...

  2. CentOS7 Docker私有仓库搭建及删除镜像 【转】

    文章来源:centos7 Docker私有仓库搭建及删除镜像 如果不想用私有镜像库,你可以用docker的库 https://hub.docker.com 环境准备 环境:两个装有Docker 17. ...

  3. “软到不行”的WWDC2018

    转载请标明来源:https://www.cnblogs.com/zhanggui/p/9154542.html 简介 一年一度的WWDC于北京时间6月5号凌晨1点在加利福利亚州圣何塞的麦克恩利会议中心 ...

  4. 学号 20175329 2018-2019-3《Java程序设计》第八周学习总结

    学号 20175329 2018-2019-3<Java程序设计>第八周学习总结 教材学习内容总结 第十五章 泛型 可以使用"class 名称"声明一个类,为了和普通的 ...

  5. 【转】详解springboot-修改内置tomcat版本

    1.解析Spring Boot父级依赖 <parent> <groupId>org.springframework.boot</groupId> <artif ...

  6. 【原创】分布式事务之TCC事务模型

    引言 在上篇文章<老生常谈--利用消息队列处理分布式事务>一文中留了一个坑,今天来填坑.如下图所示 如果服务A和服务B之间是同步调用,比如服务C需要按流程调服务A和服务B,服务A和服务B要 ...

  7. .NET 开源项目 Anet 介绍

    使用 Anet 有一段时间了,已经在我的个人网站(如 bookist.cc)投入使用,目前没有发现什么大问题,所以才敢写篇文章向大家介绍. GitHub 地址:https://github.com/a ...

  8. 初识:java虚拟机的内存划分

    什么是内存? 内存是计算机中的重要原件,临时存储区域,作用是运行程序.我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存.Java虚拟机要运行程序 ...

  9. Codeforces Round #498 (Div. 3)--E. Military Problem

    题意问,这个点的然后求子树的第i个节点. 这道题是个非常明显的DFS序: 我们只需要记录DFS的入DFS的时间,以及出DFS的时间,也就是DFS序, 然后判断第i个子树是否在这个节点的时间段之间. 最 ...

  10. 1 vmware 如何联网,以及行命令令初步

    VMware安装Linux(我安装的是ubuntu),没法上网,上网教程见:https://blog.csdn.net/qq_28090573/article/details/78730552 安装完 ...