一.Entity Framework的入门  我这里采用的方式是数据库自己建立  然后模型类自己建立 数据库上下文类自己建立的方式 目的在于弄懂原理 其他的数据库优先等方式这里就不写了  教程有很多。

首先创建控制台应用程序,接下来选择工具 NuGet包管理器,程序包管理控制台,默认项目选择自己要使用的项目,输入命令Install-Package EntityFramework 安装EntityFramework 。

a.安装成功后,在appconfig中添加数据库连接字符串:

<connectionStrings>
<add name="connStr" connectionString="Data Source=.;Initial Catalog=test2;User ID=sa;Password=123456" providerName="System.Data.SqlClient" />
</connectionStrings>

b.添加模型类Person:

[Table("T_Persons")]
public class Person
{
public long Id { get; set; }
public string Name { get; set; }
public DateTime CreateDatetime { get; set; }
}

[Table("T_Persons")]用于告诉程序当前的类Person映射到数据库中的T_Persons表。因为现实中很有可能我们的数据库中的表名不一定和实体类名一致。

c.添加数据库上下文类

public class MyDbContext : DbContext
{
public MyDbContext() : base("name=connStr")
{

}

public DbSet<Person> Persons { get; set; }
}

好了 到这里所以需要的准备工作已经完成  开始测试

class Program
{
static void Main(string[] args)
{
try
{
MyDbContext db = new MyDbContext();
Person p = new Person
{
Name = "五二狗",
CreateDatetime = DateTime.Now
};
db.Persons.Add(p);
db.SaveChanges();
Console.WriteLine("添加成功");
}
catch(Exception ex)
{
Console.WriteLine($"添加失败,{ex.Message}");
}
Console.ReadKey();
}
}

测试已经添加成功 ef测试ok。

二.FluentApi的学习以及使用


a.下载entityframework包并且安装

b.配置数据库连接字符串

c.新建模型类Person  这个模型类区别于上面的用法是这个模型类是一个纯净的模型类 没有其他的特性修饰

public class Person
{
public long Id { get; set; }
public string Name { get; set; }
public DateTime CreateDatetime { get; set; }
}

d.新建文件夹EntityConfig(其他文件夹名字也可 不建也可 建文件夹只是为了方便统一管理)  文件夹下添加类PersonConfig继承EntityTypeConfiguration<Person>

public class PersonConfig:EntityTypeConfiguration<Person>
{
public PersonConfig()
{
this.ToTable("T_Persons");
}
}

其实这一段代码等同于上面的[Table("T_Persons")]特性

e.新建数据库上下文类

public class MyContext : DbContext
{
public MyContext():base("name=connStr")
{

}

public DbSet<Person> Persons { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
}
}

ok  其他用法完全一致测试如下:

class Program
{
static void Main(string[] args)
{
MyContext db = new MyContext();
Person p = new Person { Name = "张三", CreateDatetime = DateTime.Now };
db.Persons.Add(p);
db.SaveChanges();
Console.WriteLine("添加成功");
}
}

三.Entity Framework 的增删改查

try
{
TestDbContext ctx = new TestDbContext();
#region 添加
/*
Person p1 = new Person { Name = "孔夫子", CreateDatetime = DateTime.Now };
Console.WriteLine($"添加前Id是{p1.Id}");
ctx.Persons.Add(p1);
ctx.SaveChanges();
Console.WriteLine("添加成功");
Console.WriteLine($"添加成功后Id是{p1.Id}");
*/
#endregion

#region 查询
/*
var list = ctx.Persons.Where(x => x.Name == "孔夫子");
foreach (var item in list)
{
Console.WriteLine(item);
}

var item = ctx.Persons.FirstOrDefault(x => x.Name == "孔夫子");
Console.WriteLine(item);

var item = ctx.Persons.SingleOrDefault(x => x.Name == "孔夫子");
Console.WriteLine(item);
*/

#endregion

#region 删除
/*
var item = (from p in ctx.Persons
where p.Name == "孔夫子"
select p).SingleOrDefault();
var item1 = ctx.Persons.Where(x => x.Name == "孔夫子").SingleOrDefault();
var item2 = ctx.Persons.SingleOrDefault(x => x.Name == "孔夫子");
if(item==null)
{
Console.WriteLine("已被删除");
}
else
{
ctx.Persons.Remove(item);
ctx.SaveChanges();
Console.WriteLine("删除成功");
}
*/
#endregion

#region 修改
/*
var item = ctx.Persons.FirstOrDefault(x => x.Name == "五二狗");
if (item == null)
{
Console.WriteLine("查无此人");
}
else
{
item.Name = "六二狗";
}
ctx.SaveChanges();
Console.WriteLine(item);
*/
#endregion
}
catch (Exception ex)
{
Console.WriteLine("出现错误 "+ex.Message);
}

Console.ReadKey();

 四.Entity Framework 原理和sql监控

如何查看我们最终到数据库中运行的sql语句呢?

#region EF原理

a.查看执行的sql
ctx.Database.Log = sql => { Console.WriteLine("*******Log******"+sql); };
var perons = ctx.Persons.Where(x => x.Name == "六二狗").SingleOrDefault();
Console.WriteLine(perons.Name);
Console.WriteLine("结束");
#endregion

添加这样一段代码就可以 其中ctx.Database.Log属性是Databse类下面的一个属性,它的类型是public Action<string> Log { get; set; }。即一个参数是string类型,没有返回类型的委托

因此我们让Log属性指向委托sql => { Console.WriteLine("*******Log******"+sql); };在程序运行过程中就可以看见具体的执行内容如下图

其中关于dbo.__MigrationHistory的可以去掉 目前暂时用不到

在数据库上下文类的构造函数中添加如下代码:

public TestDbContext() : base("name=connStr")
{
Database.SetInitializer<TestDbContext>(null);
}

再次测试:

控制台很干净了 不必要的代码都省去了。

b.ToList()的立即执行理解

看下面的一段代码

#region EF原理
ctx.Database.Log = sql => { Console.WriteLine("*******Log******"+sql); };
var perons = ctx.Persons.Where(x => x.Name.Contains("二")).ToList();
IEnumerable<Person> p = perons.Where(x => x.Name.StartsWith("章"));
//Console.WriteLine(perons.Name);
List<Person> testp = p.ToList();
Console.WriteLine("结束");
#endregion

对应的执行sql

sql只执行了对于二的查询 而章并没有参与到数据库查询中。这是因为tolist()是立即执行的。在使用了tolist()之后 ,程序已经将所有的数据加载到了内存中

此时对章的选择已经不是针对于数据库了 而是内存中的一系列数据

同理  加入第一次查询的结果保存到IEnumerable类型中 也会存在同样的问题   IEnumerable也会将结果加载到内存中

#region EF原理
ctx.Database.Log = sql => { Console.WriteLine("*******Log******"+sql); };
IEnumerable<Person> perons = ctx.Persons.Where(x => x.Name.Contains("二"));
IEnumerable<Person> p = perons.Where(x => x.Name.StartsWith("章"));
//Console.WriteLine(perons.Name);
List<Person> testp = p.ToList();
Console.WriteLine("结束");
#endregion

那么换一种方式  使用IQueryable

#region EF原理
ctx.Database.Log = sql => { Console.WriteLine("*******Log******"+sql); };
IQueryable<Person> perons = ctx.Persons.Where(x => x.Name.Contains("二"));
IQueryable<Person> p = perons.Where(x => x.Name.StartsWith("章"));
//Console.WriteLine(perons.Name);
List<Person> testp = p.ToList();
Console.WriteLine("结束");
#endregion

可以看到 在数据库查询条件同时执行了 这样效率也当然高于先查一部分数据 然后加载到内存中  之后在内存中在对这一系列数据进行操作

.Entity Framework 直接执行sql

#region EF执行sql语句
/*
//ctx.Database.ExecuteSqlCommand("insert into T_persons (name,createdatetime) values ('吴晓龙',GetDate())");
//Console.WriteLine("添加成功");
ctx.Database.Log = sql => { Console.WriteLine("*******Log******" + sql); };
string name = Console.ReadLine();
//ctx.Database.ExecuteSqlCommand($"insert into T_persons (name,createdatetime) values ('{name}',GetDate())");
ctx.Database.ExecuteSqlCommand("insert into T_persons (name,createdatetime) values ({0},GetDate())",name);
Console.WriteLine("添加成功");
*/
#endregion

Entity Fremework以及Fluentapi学习的更多相关文章

  1. Entity Framework Code First学习系列目录

    Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...

  2. Entity Framework 6.1 学习系列1--概况、安装

    原文:Entity Framework 6.1 学习系列1--概况.安装 Entity Framework:实体框架,看名字就知道是针对模型数据的.这是MS推出的一款ORM工具. 与NHibernat ...

  3. Entity Framework Code First学习系列

    Entity Framework Code First学习系列目录 Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity ...

  4. EF(Entity Framework)系统学习系列

    好久没写博客了,继续开启霸屏模式,好了,废话不多说,这次准备重新系统学一下EF,一个偶然的机会找到了一个学习EF的网站(http://www.entityframeworktutorial.net/) ...

  5. Entity Framework with MySQL 学习笔记一(安装)

    声明 :  数据库是Mysql,本人的程度只到会写sql语句(不会储蓄过程), c# 会基本的ADO.NET数据库访问,LINQ基础. 这篇只做个人学习|温习作用. 新手可以参考,也请高手指正错误, ...

  6. Entity Framework Code First 学习日记(1)精

    我最近几天正在学习Entity Framework Code First.我打算分享一系列的学习笔记,今天是第一部分: 为什么要使用Code First: 近 年来,随着domain driven d ...

  7. Entity Framework Code First 学习

    1.添加entityframework 项目-管理解决方案的 NuGet 程序包-联机-Entity Framework 2.code first Migration 工具->库程序包管理器-& ...

  8. Entity Framework with MySQL 学习笔记一(乐观并发)

    在做项目时,通常我们对乐观并发有几种处理模式 1. 告诉用户此数据已被其他人捷足先登,更改了.你就算新一下重来吧. 2.直接把数据覆盖上去,我最大. 3.用被人的数据. 这里给出 code first ...

  9. Entity Framework with MySQL 学习笔记一(拦截)

    参考 : http://msdn.microsoft.com/en-us/data/dn469464.aspx EF 允许我们在发送SQL请求和返回数据时做一些拦截的动作 比如可以自定义写 log , ...

随机推荐

  1. 机器学习算法——kNN(k-近邻算法)

    算法概述 通过测量不同特征值之间的距离进行 [分类] 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围: 数值型 和 标称型 . 算法流程 数据 样本数 ...

  2. Go | Go 使用 consul 做服务发现

    Go 使用 consul 做服务发现 目录 Go 使用 consul 做服务发现 前言 一.目标 二.使用步骤 1. 安装 consul 2. 服务注册 定义接口 具体实现 测试用例 3. 服务发现 ...

  3. 2440启动流程 <转载>

    韦东山 博客园 首页 订阅 管理 2440启动过程分析   2440启动过程分析 2440启动过程算是一个难点,不太容易理解,而对于2440启动过程的理解,影响了后面裸机代码执行流程的分析,从而看出2 ...

  4. java的各种集合为什么不安全(List、Set、Map)以及代替方案

    我们已经知道多线程下会有各种不安全的问题,都知道并发的基本解决方案,这里对出现错误的情况进行一个实际模拟,以此能够联想到具体的生产环境中. 一.List 的不安全 1.1 问题 看一段代码: publ ...

  5. Docker(Docker Toolbox)配置镜像加速更换国内源

    自己当时装的是Win10专业工作室版本,不知道为什么不支持window for docker, 所以选择了Docker Toolbox 的方式,主要是为了学习,虽然这种方式是不建议安装的,但是基础的学 ...

  6. linq 整理(前序)

    前言 对linq进行整理,分为前序.中序和后序. 前序就是一些简单的概念和模拟. 中序的话就是深挖一些思想. 后序对其进行解刨. 正文 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# ...

  7. 题解:SDOI2017 新生舞会

    题解:SDOI2017 新生舞会 Description 学校组织了一次新生舞会,Cathy 作为经验丰富的老学姐,负责为同学们安排舞伴. 有 \(n\) 个男生和 \(n\) 个女生参加舞会.一个男 ...

  8. day30 Pyhton 复习模块

    一.模块 什么是模块. 模块就是我们把装有特定功能的代码进行归类的结果. 从代码编写的单位来看我们的程序, 从小到大的顺序: 一条代码 < 语句句块 < 代码块(函数, 类) < 模 ...

  9. 【图论】USACO07NOV Cow Relays G

    题目大意 洛谷链接 给定一张\(T\)条边的无向连通图,求从\(S\)到\(E\)经过\(N\)条边的最短路长度. 输入格式 第一行四个正整数\(N,T,S,E\),意义如题面所示. 接下来\(T\) ...

  10. 深入理解RabbitMQ中的prefetch_count参数

    前提 在某一次用户标签服务中大量用到异步流程,使用了RabbitMQ进行解耦.其中,为了提高消费者的处理效率针对了不同节点任务的消费者线程数和prefetch_count参数都做了调整和测试,得到一个 ...