转载: [ASP.NET MVC]: - EF框架学习手记

1、EF(Entity Framework)
实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架。

2、什么是ORM?
ORM指的是面向对象的对象模型和关系型数据库的数据结构之间的互相转换。
(表实体跟表之间的相互转换)
ORM框架有很多,EF框架是ORM框架的其中一种,是实现了ORM思想的框架。

O=>表实体
M=>映射关系
R=>数据库.表

3、创建EF,添加-新建项-ADO.NET 实体数据模型
<configuration>
  <!--必须紧跟着configuration下面添加-->
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
  <!--数据库连接字符串,使用EF必须添加providerName="System.Data.EntityClient"-->
  <connectionStrings>
    <add name="ModelContainer" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=HX_Shop;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

4、简单的EF使用入门

  //创建EF上下文
  Model.ModelContainer db = new Model.ModelContainer();  //下面有线程内实例唯一的例子
  UserInfo info = new UserInfo();
  info.Name = "张三";
  db.UserInfo.Add(info); //添加数据
  db.SaveChanges(); //最后必须SaveChanges()才能保存,把状态的实体映射回数据库。
  //info.Id = 1; //修改或删除操作,必须要有主键。
  //db.Entry<T>(entity).State = EntityState.Added;  //添加
  //db.Entry<T>(entity).State = EntityState.Modified;  //修改
  //db.Entry<T>(entity).State = EntityState.Deleted;  //删除

4.1  EF4.0与EF5.0的写法区别。
查看代码

public T AddEntity(T entity)
{
//EF4.0的写法
添加实体
//db.CreateObjectSet<T>().AddObject(entity);
//EF5.0的写法
db.Entry<T>(entity).State = EntityState.Added;
//下面的写法统一
db.SaveChanges();
return entity;
}
public bool UpdateEntity(T entity)
{
//EF4.0的写法
//db.CreateObjectSet<T>().Addach(entity);
//db.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
//EF5.0的写法
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Modified;
return db.SaveChanges() > 0;
}
public bool DeleteEntity(T entity)
{
//EF4.0的写法
//db.CreateObjectSet<T>().Addach(entity);
//db.ObjectStateManager.ChangeObjectState(entity, EntityState.Deleted);
//EF5.0的写法
db.Set<T>().Attach(entity);
db.Entry<T>(entity).State = EntityState.Deleted;
return db.SaveChanges() > 0;
}

public IQueryable<T> LoadEntities(Func<T, bool> whereLambda)
{
//EF4.0的写法
//return db.CreateObjectSet<T>().Where<T>(whereLambda).AsQueryable();
//EF5.0的写法
return db.Set<T>().Where<T>(whereLambda).AsQueryable();
}
执行SQL语句
//EF4.0的写法
public int ExcuteSql(string sql, params ObjectParameter[] parameters)
{
return DbContext.ExecuteFunction(sql, parameters);
}
//EF5.0的写法
public int ExecuteSql(string sql, params System.Data.SqlClient.SqlParameter[] pars)
{
return DbContext.Database.ExecuteSqlCommand(sql, pars);
}

5、增删改查练习

public class BaseRepository<T> where T:class,new ()
    {
        private DbContext DbContext
        {
            get
            {
                return DbContextFactory.CreateDbContext(); //创建唯一实例。
            }
        }
        //简单查询
        public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
        {
            return DbContext.Set<T>().Where(whereLambda).AsQueryable();
        }
        //分页查询 ***
        public IQueryable<T> LoadPageEntities<S>(int pageSize, int pageIndex, out int totalCount, Expression<Func<T, bool>> whereLambda, bool isAsc, Expression<Func<T, S>> orderBy)
        {
            IQueryable<T> result = DbContext.Set<T>().Where(whereLambda).AsQueryable();
            totalCount = result.Count();  //返回总记录条数
            if (isAsc)
            {
                result = result.OrderBy(orderBy)
                    .Skip(pageSize * (pageIndex - 1))
                    .Take(pageSize)
                    .AsQueryable();
            }
            else
            {
                result = result.OrderByDescending(orderBy)
                    .Skip(pageSize * (pageIndex - 1))
                    .Take(pageSize)
                    .AsQueryable();
            }
            return result;
        }

        public T Add(T entity)
        {
            DbContext.Set<T>().Add(entity);
            return entity;
        }

        public bool Detele(T entity)
        {
            DbContext.Entry(entity).State = EntityState.Deleted;
            return true;
        }

        public bool Update(T entity)
        {
            DbContext.Entry(entity).State = EntityState.Modified;
            return true;
        }
    }

6、EF支持Database First、Model First和Code Only三种开发模式
database first :从数据库生成模型,先有数据库,根据数据库生成模型。
model first :由数据库生成的实体对象模型,先设计模型,再生成数据库。
code only : code first
http://www.cnblogs.com/fly_dragon/archive/2011/02/22/1961730.html
http://www.cnblogs.com/fcsh820/archive/2010/11/01/1866356.html

7、延迟加载机制
离线型的集合  <IQueryable>
延迟加载机制 用到这个集合时才会去加载数据(访问数据库)。

怎么避免延迟加载机制多次查询数据库的问题?
使用内存型集合ToList()  List<T>

8、Linq、Lambda表达式学习
http://www.cnblogs.com/han1982/tag/LINQ/

备注:
1、使用EF框架,EF的表必须有主键,没有会报错。
2、报错:对一个或多个实体的验证失败。实体属性赋值问题。
3、EF性能差,比ADO.NET多一步生成sql脚本,实现复杂查询生成的sql脚本。优点大于缺点。
3、EF上下文管理,保证线程内实例唯一。
//线程内部的一个内存空间
CallContext.SetData("DbContext")  //设置
CallContext.GetData("DbContext")  //获取实例 
HttpContext.Item["key"] 也是通过CallContext实现的

    /// <summary>
    /// 保证EF的上下文。线程内实例唯一,一次请求一个实例、
    /// </summary>
    public static class DbContextFactory
    {
        public static DbContext CreateDbContext()
        {
            //线程内实例唯一
            DbContext db = (DbContext)HttpContext.Current.Items["DbContext"];
            if (db == null)
            {
                db = new Model.ModelContainer();
                HttpContext.Current.Items.Add("DbContext", db);
            }
            return db;
        }
    }

EF框架学习手记的更多相关文章

  1. [ASP.NET MVC]: - EF框架学习手记

    1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架. 2.什么是ORM?ORM指的是面向对象的对象模型和关系型 ...

  2. EF框架学习

    简称EF,ADO.NET Entity Framework是微软以ADO.NET为基础所发展出来的对象关系对应(O/R Mapping)解决方案,是微软的一个ORM(面向对象的对象模型和关系型数据库的 ...

  3. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2): ...

  4. Linux.NET学习手记(7)

    前一篇中,我们简单的讲述了下如何在Linux.NET中部署第一个ASP.NET MVC 5.0的程序.而目前微软已经提出OWIN并致力于发展VNext,接下来系列中,我们将会向OWIN方向转战. 早在 ...

  5. Linux.NET学习手记(8)

    上一回合中,我们讲解了Linux.NET面对OWIN需要做出的准备,以及介绍了如何将两个支持OWIN协议的框架:SignalR以及NancyFX以OwinHost的方式部署到Linux.NET当中.这 ...

  6. 关于《Linux.NET学习手记(8)》的补充说明

    早前的一两天<Linux.NET学习手记(8)>发布了,这一篇主要是讲述OWIN框架与OwinHost之间如何根据OWIN协议进行通信构成一套完整的系统.文中我们还直接学习如何直接操作OW ...

  7. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  8. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(22)-为用户设置角色

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

随机推荐

  1. WinForm打印

    WinForm打印要用打印控件: PageSetupDialog:打印设置对话框 PrintDialog:打印对话框 PrintDocument:要打印的对象,非常重要 PrintPreviewCon ...

  2. C# 表达式学习积累

    /// <summary> /// 读取html里面的body内容(不包括<body>标签) /// </summary> /// <param name=& ...

  3. go语言 hello 小结

    在编译go语言的时候: 写了一段这样的代码 package main import "fmt" func main() {     fmt.Println("Hello, ...

  4. 电脑Windows使用中遇到的那些问题

    Win64位注册表导入方法 64位Windows操作系统注册表不同于32位Windows操作系统,Win64 位版本分为 32 位注册表项和 64 位注册表项.默认 64 位版本注册表编辑器 (Reg ...

  5. Get a List of Keys From a Dictionary in Both Python 2 and Python 3

    http://askubuntu.com/questions/656610/trying-to-install-mysql-connector-for-python-3?rq=1 trying to ...

  6. RPM Version Comparison

    https://fedoraproject.org/wiki/Archive:Tools/RPM/VersionComparison?rd=Tools/RPM/VersionComparison ht ...

  7. apache tiles 页面模板的使用

    jar包maven <!-- Tiles 模板--> <dependency> <groupId>org.apache.tiles</groupId> ...

  8. 树链剖分求LCA

    树链剖分中各种数组的作用: siz[]数组,用来保存以x为根的子树节点个数 top[]数组,用来保存当前节点的所在链的顶端节点 son[]数组,用来保存重儿子 dep[]数组,用来保存当前节点的深度 ...

  9. 理解 OpenStack 高可用(HA) (4): Pacemaker 和 OpenStack Resource Agent (RA)

    本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...

  10. tomcat 7下spring 4.x mvc集成websocket以及sockjs完全参考指南

    之所以sockjs会存在,说得不好听点,就是因为微软是个流氓,现在使用windows 7的系统仍然有近半,而windows 7默认自带的是ie 8,有些会自动更新到ie 9,但是大部分非IT用户其实都 ...