FluentApi配置存储过程

1.EF自动生成存储过程

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

一个栗子:

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

class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public DateTime BirthDay { get; set; }
}

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

public class SchoolContext: DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
//.MapToStoredProcedures();
} public DbSet<Student> Students { get; set; }
}

运行一下代码:

   class Program
{
static void Main(string[] args)
{
using (SchoolContext context=new SchoolContext())
{
//记录发往数据库的命令
context.Database.Log = Console.Write;
//添加
Student stu1 = new Student() { StudentName = "Jack", Birthday = DateTime.Now.AddYears(-) };
context.Students.Add(stu1);
context.SaveChanges();
//修改
stu1.StudentName = "Tom";
context.SaveChanges();
//删除
context.Students.Remove(stu1);
context.SaveChanges();
}
}
}

运行结果如下:

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

程序运行结果如下:

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

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

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

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

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

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

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

注意:只用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. c/c++ linux 进程间通信系列3,使用socketpair,pipe

    linux 进程间通信系列3,使用socketpair,pipe 1,使用socketpair,实现进程间通信,是双向的. 2,使用pipe,实现进程间通信 使用pipe关键点:fd[0]只能用于接收 ...

  2. python3操作MySQL数据库,一次插入多条记录的方法

    这里提供一个思路,使用字符串拼接的方法,将sql语句拼接出来,然后去执行: l = ["] s = '-' print(s.join(l))

  3. C# groupby 应用小技巧

    这两天感冒了,导致大脑无法有效运转,一个朋友问我,groupby 怎么给list 分组,然后再将其中一个字段组合起来,恩,觉得很简单,结果才发现,自己的脑子真的是不够用了: 恩,其实是想写其他的,但是 ...

  4. 【字】biang

    biang biang面的名字由来:biangbiang面是陕西关中地区的一中地区美食,因为在做这种面时会发出biang biang的声音,biang biang面因此得名.biang字简体共有42笔 ...

  5. android的listview以及画线--to thi tha

    https://www.cnblogs.com/896240130Master/p/6135165.html 这个的 https://www.jianshu.com/p/5522470760c1

  6. ZooKeeper的安装与部署

    本文讲述如何安装和部署ZooKeeper. 一.系统要求 ZooKeeper可以运行在多种系统平台上面,表1展示了zk支持的系统平台,以及在该平台上是否支持开发环境或者生产环境. 表1:ZooKeep ...

  7. Iris jwt 使用

    jwt分为三个部分: ​ 1.header,用来存储算法和token类型等信息 ​ 2.payload, 一些简单的信息 ​ 3.签名,来验证token是否合法 iris-jwt 这是初始化jwt中间 ...

  8. MySQL数据库事务及其特性

    一.事务概念 事务就是一个程序执行单元,里面的操作要么都做,要么都不做. 二.事务特性 事务有四个非常重要的特性(ACID): 原子性(Atomicity):事务是不可分割的整体,所有操作要么全做,要 ...

  9. Dubbo-Zookeeper安装

    安装zookeeper: 1.拖入tar.gz包,解压 2.建立/usr/zookeeper路径,该路径创建logs文件夹和data文件夹 3.进入conf目录,复制一份zoo_sample.cfg为 ...

  10. .Net Core应用框架Util介绍(二)

    Util的开源地址 https://github.com/dotnetcore/util Util的开源协议 Util以MIT协议开源,这是目前最宽松的开源协议,你不仅可以用于商业项目,还能把Util ...