1. Entity Framework的详细介绍:

Entity Framework简称EF,与Asp.net关系与Ado.net关系。

Entity Framework是ado.net中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。

ORM:object relation mapping 是基于关系型数据库的数据储备,实现一个模拟的面向对象的数据访问接口,理想情况下,基于这样一个面向对象的接口,持久化一个oo对象应该不需要了解任何关系型数据库存储数据的实现细节。

类似的轻量级的orm框架,dapper,patapoct

1. lambda表达式:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
//定义一个委托
public delegate int AddSum(int a,int b);
class Program
{
static void Main(string[] args)
{
Program p = new Program();
// AddSum addSum = new AddSum(p.Add);
// AddSum addSum = delegate(int a, int b) { return a + b; };
//AddSum addSum = (int a, int b) => { return a + b; };
//简化之后的lambda表达式
AddSum addSum = ( a, b) => { return a + b; };
int sum = addSum(, );
Console.WriteLine(sum);
Console.ReadKey();
} //public int Add(int a, int b)
//{
// return a + b;
//}
} }

lambda表达式

一、第一种使用EF的方法:先有数据库再建立数据模型

1. 在项目中右击新建,新建一个ADO.net实体数据模型,选择从数据库生成,这种是先有数据库再建立数据模型的方式。然后依次点击下一步便可,完成以后切记点击ctrl+s保存。不然是不会生成数据模型对应的类。

2. 注意:对应的数据库表必须有主键,不然在使用时会报错。

3. 生成之后的结构如下。

4.使用EF进行相关的增删改查代码如下:

新建的web窗体页面,分别放四个button按钮便可。

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace WebApplication2
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
/// <summary>
/// 插入数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
UserInfo UserInfo = new UserInfo();
UserInfo.UserName = "张五呀";
UserInfo.UserPass = "123qwe";
UserInfo.RegTime = ;
UserInfo.Email = "wangjin";
AdwResourcesEntities1 db = new AdwResourcesEntities1();
//将数据添加到EF中,并且添加了标记,并且类似于生成了一条insert语句,但是这时候还没有执行该语句
db.UserInfo.Add(UserInfo);
//之后执行该代码时,才会执行insert语句,并且返回受影响行数
db.SaveChanges();
//返回刚刚插入的主键ID
Response.Write(UserInfo.ID);
}
/// <summary>
/// 查询数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button2_Click(object sender, EventArgs e)
{
AdwResourcesEntities1 db = new AdwResourcesEntities1();
var userinfolist = from u in db.UserInfo //linq表达式
where u.ID ==
select u;
//EF的延迟加载机制,只有数据在使用的时候才会去数据库中查询,不用的时候不查询。
//只有执行下面的代码的时候才会去执行,这样可以提高整体的性能
foreach (var userinfo in userinfolist)
{
Response.Write(userinfo.ID);
}
//FirstOrDefault 查询第一条数据或者查询默认值
//userinfolist.FirstOrDefault();
}
/// <summary>
/// 删除数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button3_Click(object sender, EventArgs e)
{
AdwResourcesEntities1 db = new AdwResourcesEntities1();
var userinfolist = from u in db.UserInfo
where u.ID ==
select u;
//返回第一条数据,如果没有就放回null
UserInfo userinfo = userinfolist.FirstOrDefault();
if (userinfo != null)
{
db.UserInfo.Remove(userinfo);
db.SaveChanges();
Response.Write("删除成功");
}
else
{
Response.Write("数据有误");
} ////执行删除的第二种方法
//UserInfo userInfo = new UserInfo() {ID=344};
db.Entry<UserInfo>(userinfo).State = System.Data.Entity.EntityState.Deleted;
//db.SaveChanges();
} /// <summary>
/// 修改数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button4_Click(object sender, EventArgs e)
{
//构建一个
AdwResourcesEntities1 db = new AdwResourcesEntities1();
var userinfolist = from u in db.UserInfo
where u.ID ==
select u;
UserInfo userinfo = userinfolist.FirstOrDefault();
userinfo.UserPass = "qweqwe";
db.Entry<UserInfo>(userinfo).State = System.Data.Entity.EntityState.Modified;
db.SaveChanges();
Response.Write("修改成功");
}
}
}

二、第二种ModelFirst模式使用EF的方法,先建立数据模型,再生成数据库对应的表。

1. 先在数据库中新建一个数据库。

2.  在项目中右击新建项目,选择数据源,点击空模型。

3. 在生成的空白界面中,右击新增实体,新增之后再新增标量属性,如果是多表,并且有关联的表,右击新增关联,再右击根据数据模型生成数据库。

4. 点击如下文件,需要点击执行才会生成数据库。

5. 使用第二种进行增删改查的相关代码如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace WebApplication1
{
public partial class WebForm2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
/// <summary>
/// 插入数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
Model2Container db = new Model2Container();
Customer customer = new Customer() {CustomerName="zhangsan",CustomerPwd="", SubTime=DateTime.Now };
// Customer = customer导航属性,代表下面的数据属于上面的值
OrderInfo orderInfo1 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "", CreateDateTime = DateTime.Now,Customer=customer };
OrderInfo orderInfo2 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "", CreateDateTime = DateTime.Now, Customer = customer };
db.Customer.Add(customer);
db.OrderInfo.Add(orderInfo1);
db.OrderInfo.Add(orderInfo2);
db.SaveChanges();//默认的已经开启了事务。 工作单元模式。(UnitOfwork)
}
/// <summary>
/// 查询数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button2_Click(object sender, EventArgs e)
{
Model2Container db = new Model2Container();
var customerList = from c in db.Customer
select c;
foreach (var customer in customerList)
{
Response.Write(customer.CustomerName+":"); foreach (var orderInfo in customer.OrderInfo)//延迟加载。
{
Response.Write(orderInfo.OrderNum);
}
}
}
/// <summary>
/// 根据名字id查询所有的订单
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button3_Click(object sender, EventArgs e)
{
Model2Container db = new Model2Container();
//var customerInfoList = from c in db.Customer
// where c.ID == 1
// select c;
//var customerInfo = customerInfoList.FirstOrDefault();
//foreach (var orderInfo in customerInfo.OrderInfo)
//{
// Response.Write(orderInfo.OrderNum);
//} var orderInfoList = from o in db.OrderInfo
where o.CustomerID ==
select o;
foreach (var orderInfo in orderInfoList)
{
Response.Write(orderInfo.OrderNum);
} }
/// <summary>
/// 输出10001对应的客户ID
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button4_Click(object sender, EventArgs e)
{
Model2Container db = new Model2Container();
var orderInfoList = from o in db.OrderInfo
where o.OrderNum == ""
select o;
var orderInfo = orderInfoList.FirstOrDefault();
Customer customer = orderInfo.Customer;
Response.Write(customer.CustomerName);
}
/// <summary>
/// 根据人员ID删除对应数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button5_Click(object sender, EventArgs e)
{
Model2Container db = new Model2Container();
//var customer = (from c in db.Customer
// where c.ID == 1
// select c).FirstOrDefault();
//var orderInfoList = customer.OrderInfo;
//while (orderInfoList.Count > 0)
//{
// var orderInfo = orderInfoList.FirstOrDefault();
// db.Entry<OrderInfo>(orderInfo).State = System.Data.EntityState.Deleted;
//}
//db.SaveChanges(); var orderList = from o in db.OrderInfo
where o.CustomerID ==
select o; } }
}

三、第三种codeFirst模式,该模式是指不建立数据模型,并且不建立建立数据库的情况下,通过代码的形式去新建一个数据库。

1. :创建实体类,并且给实体加上特性标签,并且标注一下实体类之间的关系。

1.1创建classInfo(班级)实体类

 using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace CodeFirstDemo
{
public class ClassInfo
{
[Key] //特性标签
public int Id { get; set; }
[StringLength()] //指定是字符串类型
[Required] //必填项
public string ClassName { get; set; }
[Required]
public DateTime CreateTime { get; set; }
//表示1对多,指一个班级对应多个学生
public virtual ICollection<StudentInfo> StudentInfo { get; set; }
}
}

1.2 :创建学生实体类

 using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace CodeFirstDemo
{
public class StudentInfo
{
[Key]
public int Id { get; set; }
[StringLength()]
[Required]
public string StuName { get; set; }
[Required]
public DateTime SubTime { get; set; }
public virtual ClassInfo ClassInfo { get; set; } //表明外键关系,多对1
}
}

1.3. 引用Entity

  方法1,点击引用,system.data.Entity

  方法2. 新建一个数据模型,之后删掉,此时已经自动引用了entity

1.4 :创建codefirstdbcontext:dbcontext文件

  

 using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace CodeFirstDemo
{
public class CodeFirstDbContext:DbContext
{
public CodeFirstDbContext()
: base("name=connStr") //对应连接数据库字符串的名字
{ }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//此代码的功能是移除复数的约定 就是指生成的表名后面不加S
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
//对应的表
public DbSet<ClassInfo> ClassInfo { get; set; }
public DbSet<StudentInfo> StudentInfo { get; set; }
}
}

1.5 :在配置文件构建数据库链接字符串。

  <configSections>
2 <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
3 </configSections>

1.6:查询部分数据以及实例创建代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls; namespace WebApplication1
{
public partial class WebForm3 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
/// <summary>
/// 只查询其中几列数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button1_Click(object sender, EventArgs e)
{
//使用HttpContext,只要持续调用,就一直都不会中断
EFFristModelEntities db = null;
if (HttpContext.Current.Items["db"] == null)
{
db = new EFFristModelEntities();
HttpContext.Current.Items["db"] = db;
}
else
{
db = HttpContext.Current.Items["db"] as EFFristModelEntities;
} var userInfoList = from u in db.UserInfo
where u.ID ==
select new{UName=u.UserName,UPwd=u.UserPass}; //新建一个匿名类查询
foreach (var userInfo in userInfoList)
{
Response.Write(userInfo.UName+":"+userInfo.UPwd);
} }
/// <summary>
/// 匿名函数来查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Button2_Click(object sender, EventArgs e)
{
// Func<UserInfo, bool> whereLambda = u => { return u.ID == 343; }; EFFristModelEntities db = new EFFristModelEntities();
//var userInfoList = db.UserInfo.Where<UserInfo>(u=>u.ID==3); //select * from UserInfo where id=343
//升序排序
//var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderBy<UserInfo, int>(u => u.ID);
//降序排序
//var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderByDescending(u => u.ID); int pageIndex = ;
int pageSize = ;
var userInfoList = (from u in db.UserInfo
where u.ID >
orderby u.RegTime ascending, u.ID descending
select u).Skip<UserInfo>((pageIndex - ) * pageSize).Take<UserInfo>(pageSize); // var userInfoList = db.UserInfo.Where<UserInfo>(U => true).OrderByDescending(u => u.UserPass).ThenByDescending<UserInfo, int>(u => u.ID);//Skip:表示跳过多少条记录, Take取多少条记录 foreach (var userInfo in userInfoList)
{ Response.Write(userInfo.UserName + "<br/>"); }
} protected void Button3_Click(object sender, EventArgs e)
{
string str ="ttttt";
Response.Write (str.MyStr());
} protected void Button4_Click(object sender, EventArgs e)
{
EFFristModelEntities db = new EFFristModelEntities(); var userInfoList = db.UserInfo.Where<UserInfo>(u => u.ID >); int i = ;
int count = userInfoList.Count();
Response.Write(count); }
}
}

查询部分数据以及实例创建代码

以上就是EF创建和操作的详细介绍,欢迎评论和留言

Entity Framework框架 (一)的更多相关文章

  1. Entity Framework 框架

    微软官方提供的ORM技术的实现就是EF(Entity Framework)框架.EF的模式有三种分别是:Database First  数据库先行 ,Model First 模型先行 , Code F ...

  2. 深入了解Entity Framework框架及访问数据的几种方式

    一.前言 1.Entity Framework概要 Entity Framework是微软以ADO.NET为基础所发展出来的对象关系映射(O/R Mapping)解决方案.该框架曾经为.NET Fra ...

  3. Entity Framework框架 (二)

    一.前面一篇EF的介绍主要是通过linq语句,本篇主要是介绍一下不通过linq语句如何去操作EF执行查询sql语句与执行存储过程. 1.  其中的Acccout是输出参数对应的类.比如输出参数有三个值 ...

  4. Entity Framework 实体框架的形成之旅--数据传输模型DTO和实体模型Entity的分离与联合

    在使用Entity Framework 实体框架的时候,我们大多数时候操作的都是实体模型Entity,这个和数据库操作上下文结合,可以利用LINQ等各种方便手段,实现起来非常方便,一切看起来很美好.但 ...

  5. Entity Framework实体框架使用TrackerEnabledDbContext进行操作日志跟踪

    在EF实体框架中进行日志跟踪,一般都是自己写个Log实体类,在数据保存时进行属性原始值验证来进行日志跟踪.当然还可以使用一些第三扩展库例如:entity framework extended进行日志记 ...

  6. 开发 ASP.NET vNext 续篇:云优化的概念、Entity Framework 7.0、简单吞吐量压力测试

    继续上一篇<开发 ASP.NET vNext 初步总结(使用Visual Studio 2014 CTP1)>之后, 关于云优化和版本控制: 我本想做一下MAC和LINUX的self-ho ...

  7. 分享关于Entity Framework 进行CRUD操作实验的结果

    我们在使用Entity Framework框架进行CRUD时,经常会出现各种各样的错误,下面请看我的实验结果. 以下是只用一个上下文对象进行操作: 第一次: BlogDbContext blog = ...

  8. Entity Framework 之三层架构

    今天,我们谈一下如何用Entity Framework构建一个三层架构.即包括DAL层,BLL层和MODEL层.我们先看一下目录结构,如下图: 目录中,我们有Web层,AVON.DMS.Model是实 ...

  9. Entity Framework基金会

    概要 Entity Framework缩写EF,微软ORM产品. 本篇博客将简单的介绍它,至于它的详细深层次的使用,大家能够查询对应的操作手冊,该篇不过入门. Entity Framework和Lin ...

随机推荐

  1. 使用Holer将本地端口映射到公网

    What is holer Holerexposes local servers behind NATs and firewalls to the public internet over secur ...

  2. ES6知识整理(3)--函数的扩展

    只有整理过的学习才是有效的学习.也就是学习之后要使用和整理成文,才是真正的学到了... 最近上班有点忙的关系,于是文章更新会慢些.只有晚上加完班之后,空余时间才能学习整理.因此完成一篇也可能要几个晚上 ...

  3. no matching editors or conversion strategy found

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionM ...

  4. 给PXC集群加密

    MySQL的复制时明文的,不管是集群的复制还是IST/SST,直接通过抓包就可以抓取数据. 生成证书 直接使用 mysql_ssl_rsa_setup mysql_ssl_rsa_setup --da ...

  5. Docker学习笔记之常用的 Docker Compose 配置项

    0x00 概述 与 Dockerfile 一样,编写 Docker Compose 的配置文件是掌握和使用好 Docker Compose 的前提.编写 Docker Compose 配置文件,其本质 ...

  6. 【题解】Luogu P2073 送花

    原题传送门 这题需要用到Splay 我们用一棵splay维护金钱 考虑c<=1000000 我们珂以把每种价格现在对应的美丽值存在一个a数组中 这样讲有珂能不太清楚qaq,还是对着操作一个一个讲 ...

  7. 【题解】Luogu P2604 [ZJOI2010]网络扩容

    原题传送门:P2604 [ZJOI2010]网络扩容 这题可以说是板题 给你一个图,先让你求最大流 再告诉你,每条边可以花费一些代价,使得流量加一 问至少花费多少代价才能使最大流达到k 解法十分简单 ...

  8. ajax返回数据

    在使用远程js验证检测账户是否存在时,直在发请求后返回值无效,怎样把值返回回来呢重点注意两点 第一点:type不能省略,不能是异步,async: false 第二点:不能在直接请求成功后返回 var ...

  9. 2018-2019-1 20189206 《Linux内核原理与分析》第七周作业

    linux内核分析学习笔记 --第六章 进程的描述和进程的创建 学习重点--子进程的创建以及运行流程 进程描述和进程的创建 操作系统的三大功能--进程管理.内存管理和文件系统. 在linux内核中利用 ...

  10. py4CV例子2汽车检测和svm算法

    1.什么是汽车检测数据集: ) pos, neg = , ) matcher = cv2.FlannBasedMatcher(flann_params, {}) bow_kmeans_trainer ...