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设置状态

显示行号 复制代码 ? Program.cs
  1. //修改 -- 优化(创建对象 直接修改)
  2. static void Update2()
  3.         {
  4. //方法1:取消验证
  5.             //DBpek.Configuration.ValidateOnSaveEnabled = false;
  6.             //1.查询出1个要修改的对象
  7. TUser user = new TUser() { UserID = 44, PassWord = "aaa" };
  8. //2.将对象加入 EF容器,设置当前实体对象的 状态管理对象
  9. DbEntityEntry<TUser> entry = DBpek.Entry<TUser>(user);
  10. //3.设置 该对象 未被修改过
  11. entry.State = EntityState.Unchanged;
  12. //4.设置 要修改的对象的(PassWord属性) 为修改状态,entry.State自动为Modified
  13. entry.Property("PassWord").IsModified = true;
  14. //5.保存到数据库 -- EF上下文根据entry.State=modified生成sql
  15. try
  16. {
  17.                 DBpek.SaveChanges();
  18.             }
  19. catch (DbEntityValidationException ex)
  20.             {
  21. Console.WriteLine(ex.EntityValidationErrors);          
  22.             }
  23. Console.WriteLine("修改后:" + user.UserName);
  24. Console.WriteLine("修改成功!");
  25.         }

出现验证问题?

解决方法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)的更多相关文章

  1. MVC – 3.EF(Entity Framework)

    1.实体框架(EF)简介 与ADO.NET的关系 全称是ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框 ...

  2. NHibernate与EF(Entity Framework)的区别

    http://www.cnblogs.com/lukun/archive/2011/05/16/2047587.html NHibernate与EF(Entity Framework)的区别 http ...

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

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

  4. C#:ORM--实体框架EF(entity framework)(1)

    本文来自:http://www.cnblogs.com/xuf22/articles/5513283.html 一.什么是ORM ORM(Object-relational mapping),中文翻译 ...

  5. C#:ORM--实体框架EF(entity framework)(2)

    有三种不同的模式可以在您的应用中使用EF框架 Database First Code First ModelFirst Db-First 在DbFirst时,你使用VS中的EDM向导或使用EF命令来从 ...

  6. 实体框架(Entity Framework)简介

    实体框架(Entity Framework)简介 简称EF,与ADO.NET关系 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R ...

  7. 实体框架(Entity Framework)

    实体框架(Entity Framework) 实体框架(Entity Framework)简介 ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对 ...

  8. 【转】在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动

    在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...

  9. 在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动

    在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...

随机推荐

  1. 洛谷八连测R5题解

    woc居然忘了早上有八连测T T 还好明早还有一场...今天的题除了T3都挺NOIP的... T1只需要按横坐标第一关键字,纵坐标第二关键字排序一个一个取就好了... #include<iost ...

  2. 解题:NOIP 2018 赛道修建

    题面 几乎把我送退役的一道题,留在这里做个纪念. 考场看出来是原题结果为了求稳强行花了一个小时写了80pts暴力,然后挂了55pts(真·暴力写挂),结果今天花了不到半个小时连想带写一遍95pts(T ...

  3. 【bzoj3170】[Tjoi2013]松鼠聚会

    3170: [Tjoi2013]松鼠聚会 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1670  Solved: 885[Submit][Statu ...

  4. [CTSC2007]动物园zoo

    link 试题分析 发现每个小朋友最多只能看到$5$个动物所以考虑状压$dp$.我们定义$f(i,j)$为第$i$个位置从此往后$5$个人的最喜欢数量.所以只要预处理出对于每个点从后$5$个会让多少小 ...

  5. 【SQL优化】MySQL官网中可优化的层次结构

    正如上一篇中我翻译的那篇文章,关于MySQL数据库优化的宏观介绍,了解到了从大体上来讲,优化MySQL可以从3个角度来讲.那么这一篇文章,则从一个个优化点出发,统计出究竟有多少个地方我们可以来优化My ...

  6. EXT 翻页后查询 页数不重置

    测试查询条件时,当表格翻页后,输入查询条件,页数不刷新,还是之前的页数,导致列表不显示数据.只要在查询时,将表格的currentPage 设为1 即可. store.currentPage = 1; ...

  7. Java基础之equals() 和 hashCode()

    equals()是Object中的一个方法: public boolean equals(Object obj) { return (this == obj); } 在Object中equals()方 ...

  8. HDU 6053 TrickGCD 莫比乌斯函数/容斥/筛法

    题意:给出n个数$a[i]$,每个数可以变成不大于它的数,现问所有数的gcd大于1的方案数.其中$(n,a[i]<=1e5)$ 思路:鉴于a[i]不大,可以想到枚举gcd的值.考虑一个$gcd( ...

  9. 760A 水

    LINK 第一天单独一行 其余7天一行 问某月有多少行 ...... /** @Date : 2017-04-02-21.35 * @Author : Lweleth (SoungEarlf@gmai ...

  10. ④ 设计模式的艺术-04.抽象工厂(Abstract Factory)模式

    抽象工厂模式 用来生产不同产品族的全部产品.(对于增加新的产品,无能为力:支持增加产品族) 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种.业务分类时,通过抽象工厂模式产生需要的对象是一种非常 ...