MVC – 3.EF(Entity Framework)

1.实体框架(EF)简介
与ADO.NET的关系
全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架
特点:
1. 支持多种数据库(MSSQL, Oracle, and DB2)
2. 强劲的映射引擎,能很好地支持存储过程;
3. 提供Visual Studio集成工具,进行可视化操作
4. 能够与ASP.NET, WPF, WCF, WCF Data Services进行很好的集成。

2.edmx文件

新建一个PKE.edmx

用XML打开的情况

3.简单的增删改查

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace FirstEF
{
class Program
{
static void Main(string[] args)
{
Query();
Console.ReadKey();
}
/// <summary>
/// 数据上下文对象
/// </summary>
static CoolPEKEntities DBpek = new CoolPEKEntities();
//新增
static void Add()
{
//1.创建实体对象
TUser user = new TUser()
{
UserName = "刘德华",
PassWord = "001",
CreatTime = DateTime.Now,
Roel = 0
};
//2.通过EF新增到数据库
//将对象 加入到 数据上下文 的 TUser 集合中
DBpek.TUsers.Add(user);
//调用数据上下文的保存方法 将对象 存数据库
DBpek.SaveChanges();
Console.WriteLine("添加成功!");
}
//查询
static void Query()
{
//标准查询
//List<TUser> listTUser = DBpek.TUsers.Where(d => d.UserName == "刘德华").ToList();
//listTUser.ForEach(d => Console.WriteLine(d.UserID + "," + d.UserName + "," + d.CreatTime));
//linq查询
List<TUser> list = DBpek.TUsers.ToList();
var listlinq = from d in list
where d.UserName == "刘德华"
select d
;
foreach (var user in listlinq)
{
Console.WriteLine(user.UserID + "," + user.UserName + "," + user.CreatTime);
}
}
//修改 -- 官方推荐修改方式(先查询,再修改)
static void Update()
{
//查询出1个要修改的对象
var use = DBpek.TUsers.Where(d => d.UserID == 53).FirstOrDefault();
Console.WriteLine("修改前:" + use.UserName);
use.UserName = "张学友";
DBpek.SaveChanges();
Console.WriteLine("修改后:" + use.UserName);
Console.WriteLine("修改成功!");
}
//删除 -- 不推荐用官方的先查后删(自己直接删)
static void Delete()
{
//创建要删除的对象
TUser u = new TUser() { UserID = 55 };
//附加到EF中
DBpek.TUsers.Attach(u);
//标记为删除
DBpek.TUsers.Remove(u);
//执行SQL
DBpek.SaveChanges();
Console.WriteLine("删除成功!");
}
}
}
4.延迟加载
原因:
/************************************************************************/
/*集合的标准查询运算符方法,来自于System.Linq.Enumerable里给IEnumerable接口添加的查询方法
* List<string> listStr = new List<string>();
*
*EF上下文里的 DBSet<T> 里的标准查询运算符方法,来自于System.Linq.Queryable里 给IQueryable接口添加的方法
*延迟加载,本质原因一: 当前可能通过多个SQO方法来组合 查询条件,那么每个方法 都只是添加一个查询条件而已,
* 无法确定本次查询条件是否已经添加结束
* 所以,没有办法在每个SQO方法的时候确定SQL语句是什么,只能返回一个包含了所有添加条件的 DbQuery对象
* 当使用这个 DbQuery对象 的时候,才根据所有条件生成 SQL 语句,查询数据库
/************************************************************************/
DbQuery<TUser> dbQuery = DBpek.TUsers.Where(d => d.UserName == "刘德华").OrderBy(d => d.UserID) as DbQuery<TUser>;
TUser u = dbQuery.FirstOrDefault();
Console.WriteLine(u.UserName);
5.Include及时加载-生成inner join

//按需加载的缺点:会为每次调用外键实体时,都会去查询数据(EF有小优化:相同的外键实体值查一次)
IQueryable<PKE_DeviceNumber> dba = DBpek.PKE_DeviceNumber;
foreach (PKE_DeviceNumber pkeDeviceNumber in dba)
{
Console.WriteLine(pkeDeviceNumber.DeviceNumber + "," + pkeDeviceNumber.PKE_Franchiser.Remark);
}

使用Include方法,只调用一次连接查询
//连接查询(生成 InnerJoin)
IQueryable<PKE_DeviceNumber> db = DBpek.PKE_DeviceNumber.
Include
("PKE_Franchiser");
foreach (PKE_DeviceNumber pkeDeviceNumber in db)
{
Console.WriteLine(pkeDeviceNumber.DeviceNumber + "," + pkeDeviceNumber.PKE_Franchiser.Remark);
}

6.EF容器--修改时,不使用Attach( )方式,使用Entry<T>
1.代理类的用处
2.修改时,不使用Attach( )方式
3.修改时,使用Entry设置状态
//修改 -- 优化(创建对象 直接修改)
static void Update2()
{//方法1:取消验证
//DBpek.Configuration.ValidateOnSaveEnabled = false;
//1.查询出1个要修改的对象
TUser user = new TUser() { UserID = 44, PassWord = "aaa" };//2.将对象加入 EF容器,设置当前实体对象的 状态管理对象
DbEntityEntry<TUser> entry = DBpek.Entry<TUser>(user);
//3.设置 该对象 未被修改过
entry.State = EntityState.Unchanged;
//4.设置 要修改的对象的(PassWord属性) 为修改状态,entry.State自动为Modified
entry.Property("PassWord").IsModified = true;//5.保存到数据库 -- EF上下文根据entry.State=modified生成sql
try
{DBpek.SaveChanges();
}
catch (DbEntityValidationException ex)
{Console.WriteLine(ex.EntityValidationErrors);
}
Console.WriteLine("修改后:" + user.UserName);Console.WriteLine("修改成功!");}
出现验证问题?

解决方法1:
static Program()
{
//方法1:取消验证
DBpek.Configuration.ValidateOnSaveEnabled = false;
}
解决方法2:

根据错误 添加UserName.
7.EF配置文件

8.三层
DAL/User.cs
using System;
using System.Collections.Generic;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using MODEL.Models;
using System.Data; namespace DAL
{
public class User
{
//数据上下文
private OumindBlogContext db = new OumindBlogContext(); //新增方法
public int Add(MODEL.Models.User model)
{
db.Users.Add(model);
return db.SaveChanges();
} #region 根据用户ID删除 /// <summary>
/// 根据用户ID删除
/// </summary>
/// <param name="uid"></param>
/// <returns></returns>
public int Del(int uid)
{
MODEL.Models.User us = new MODEL.Models.User() { uId = uid };
db.Users.Attach(us);
db.Users.Remove(us);
return db.SaveChanges();
} #endregion /// <summary>
/// 根据条件删除
/// </summary>
/// <param name="delWhere"></param>
/// <returns></returns>
public int DelBy(Expression<Func<MODEL.Models.User, bool>> delWhere)
{
List<MODEL.Models.User> listDeleting = db.Users.Where(delWhere).ToList();
listDeleting.ForEach(d => db.Users.Remove(d));
return db.SaveChanges();
} /// <summary>
/// 条件修改
/// </summary>
/// <param name="model">要修改的实体对象</param>
/// <param name="proNames">修改的属性名称</param>
/// <returns></returns>
public int Modify(MODEL.Models.User model, params string[] proNames)
{
DbEntityEntry entry = db.Entry<MODEL.Models.User>(model);
entry.State = System.Data.Entity.EntityState.Unchanged;
foreach (var s in proNames)
{
entry.Property(s).IsModified = true;
}
return db.SaveChanges();
} /// <summary>
/// 条件查询
/// </summary>
/// <param name="whereLambda"></param>
/// <returns></returns>
public List<MODEL.Models.User> GetListBy(Expression<Func<MODEL.Models.User, bool>> whereLambda)
{
return db.Users.Where(whereLambda).ToList();
}
/// <summary>
/// 条件查询(排序)
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="whereLambda"></param>
/// <param name="orderLambda"></param>
/// <returns></returns>
public List<MODEL.Models.User> GetListBy<TKey>(Expression<Func<MODEL.Models.User, bool>> whereLambda,
Expression<Func<MODEL.Models.User, TKey>> orderLambda)
{
return db.Users.Where(whereLambda).OrderBy(orderLambda).ToList();
} /// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="Tkey"></typeparam>
/// <param name="whereLambda">查询条件</param>
/// <param name="orderLambda">排序条件</param>
/// <param name="pageIndex">页码</param>
/// <param name="pageSize">页容量</param>
/// <returns></returns>
public List<MODEL.Models.User> GetPageList<Tkey>(Expression<Func<MODEL.Models.User, bool>> whereLambda,
Expression<Func<MODEL.Models.User, Tkey>> orderLambda, int pageIndex, int pageSize)
{
return db.Users.Where(whereLambda).OrderBy(orderLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
}
}
}
问题
未能加载文件或程序集“EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)

解决方案:

MVC – 3.EF(Entity Framework)的更多相关文章
- MVC – 3.EF(Entity Framework)
1.实体框架(EF)简介 与ADO.NET的关系 全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框 ...
- NHibernate与EF(Entity Framework)的区别
http://www.cnblogs.com/lukun/archive/2011/05/16/2047587.html NHibernate与EF(Entity Framework)的区别 http ...
- EF(Entity Framework)系统学习系列
好久没写博客了,继续开启霸屏模式,好了,废话不多说,这次准备重新系统学一下EF,一个偶然的机会找到了一个学习EF的网站(http://www.entityframeworktutorial.net/) ...
- C#:ORM--实体框架EF(entity framework)(1)
本文来自:http://www.cnblogs.com/xuf22/articles/5513283.html 一.什么是ORM ORM(Object-relational mapping),中文翻译 ...
- C#:ORM--实体框架EF(entity framework)(2)
有三种不同的模式可以在您的应用中使用EF框架 Database First Code First ModelFirst Db-First 在DbFirst时,你使用VS中的EDM向导或使用EF命令来从 ...
- 实体框架(Entity Framework)简介
实体框架(Entity Framework)简介 简称EF,与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...
- 实体框架(Entity Framework)
实体框架(Entity Framework) 实体框架(Entity Framework)简介 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对 ...
- 【转】在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动
在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...
- 在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动
在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...
随机推荐
- cin/cout与scanf/printf的比较
转自http://www.cnblogs.com/penelope/articles/2426577.html cin .cout 基本说明: cin是标准输入流对象,代表标准输入设备(键盘), ...
- Linux 进程的 Uninterruptible sleep(D) 状态
首先,说一下产生D状态的原因. 上图阐释了一个进程运行的情况,首先,运行的时候,进程会向内核请求一些服务,内核就会将程序挂起进程,并将进程放到parked队列,通常这些进程只会在parked队列中停留 ...
- Meeting HDU - 5521 虚点建图
Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer John ...
- 前端端对端测试:基于PhantomJS的CasperJS
简介 Casperjs是一个基于PhantomJS和SlimerJS的前端端对端测试框架,当然你也可以使用它完成网络爬虫功能,它的特点的通过简单的脚本模拟浏览器行为, 主要有casper.tester ...
- [DeeplearningAI笔记]序列模型2.1-2.2词嵌入word embedding
5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.1词汇表征 Word representation 原先都是使用词汇表来表示词汇,并且使用1-hot编码的方式来表示词汇 ...
- Asp.net mvc 大文件上传 断点续传 进度条
概述 项目中需要一个上传200M-500M的文件大小的功能,需要断点续传.上传性能稳定.突破asp.net上传限制.一开始看到51CTO上的这篇文章,此方法确实很不错,能够稳定的上传大文件,http: ...
- Digging(DP)
ZOJ Problem Set - 3689 Digging Time Limit: 2 Seconds Memory Limit: 65536 KB When it comes to th ...
- 10款好用的 jQuery 图片切换效果插件
jQuery 是一个非常优秀的 Javascript 框架,使用简单灵活,同时还有许多成熟的插件可供选择.其中,最令人印象深刻的应用之一就是对图片的处理,它可以让帮助你在你的项目中加入一些让人惊叹的效 ...
- 【洛谷 P3168】 [CQOI2015]任务查询系统(主席树)
题目链接 被自己的sb错误调到自闭.. 主席树的进阶应用. 把\(P_i\)离散化一下,得到每个\(P_i\)的排名,然后建一棵维护\(m\)个位置的主席树,每个结点记录区间总和和正在进行的任务数. ...
- 【洛谷 P1502】 窗口的星星(扫描线)
题目链接 把每个星星作为左下角,做出长为\(w-0.5\),宽为\(h-0.5\)的矩形. \(-0.5\)是因为边框上的不算. 离散化\(y\)坐标. 记录\(2n\)个\(4\)元组\((x,y1 ...