zoukankan      html  css  js  c++  java
  • MVC – 3.EF(Entity Framework)

    image

    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进行很好的集成。

    EF-snagit

      

    2.edmx文件

    image

    新建一个PKE.edmx

    image

    用XML打开的情况

    image

    3.简单的增删改查

    image
     
    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

    image

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

    image

    使用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);
                }

    image

    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.         }

    出现验证问题?

    image

    解决方法1:

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

    解决方法2:

    image

    根据错误 添加UserName.

    7.EF配置文件

    image

    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)

    image

    解决方案:

    image

  • 相关阅读:
    jquery $.fn $.fx 的意思以及使用
    jQuery树形控件zTree使用
    myeclipse9.0安装svn插件
    读取properties和xml中配置文件的值
    Jquery之ShowLoading遮罩组件
    程序员需谨记的8条团队开发原则(转)
    决策树算法
    第N个丑数
    数组反转
    倒数第K个结点
  • 原文地址:https://www.cnblogs.com/tangge/p/3416107.html
Copyright © 2011-2022 走看看