博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EF框架学习手记
阅读量:7067 次
发布时间:2019-06-28

本文共 5652 字,大约阅读时间需要 18 分钟。

转载: 

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
(entity).State = EntityState.Added; //添加 //db.Entry
(entity).State = EntityState.Modified; //修改 //db.Entry
(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
where T:class,new () { private DbContext DbContext { get { return DbContextFactory.CreateDbContext(); //创建唯一实例。 } } //简单查询 public IQueryable
LoadEntities(Expression
> whereLambda) { return DbContext.Set
().Where(whereLambda).AsQueryable(); } //分页查询 *** public IQueryable
LoadPageEntities
(int pageSize, int pageIndex, out int totalCount, Expression
> whereLambda, bool isAsc, Expression
> orderBy) { IQueryable
result = DbContext.Set
().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
().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表达式学习

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

///     /// 保证EF的上下文。线程内实例唯一,一次请求一个实例、    ///     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;        }    }

转载于:https://www.cnblogs.com/mjxxsc/p/4583570.html

你可能感兴趣的文章
八皇后问题
查看>>
切蛋糕
查看>>
关于对于CSS的字体单位
查看>>
TCP协议学习总结(上)
查看>>
敏捷 扑克上的时间估算(转)
查看>>
从JDBC程序看为什么需要Mybatis
查看>>
jQuery Ajax
查看>>
压缩感知中的数学知识:稀疏、范数、符号arg min
查看>>
《JavaScript高级程序设计》笔记
查看>>
刚刚在园里看到的一个简单的做连接字符串的方法.
查看>>
JQ_简单瀑布流
查看>>
测试管理-测试问题监控
查看>>
thinkphp的taglib的使用方法
查看>>
tecplot批量导出图片_Fluent 后处理软件Tecplot宏批量处理cas,dat为图片
查看>>
锂电池放空后充不进电_充电锂电池,只几个月不用,为什么就再也充不进电了?...
查看>>
golang mutex 初始化_Golang连接池的几种实现案例
查看>>
docker可以把应用及其相关的_等离子表面处理机相关应用及其特点
查看>>
发电厂电气部分第三版pdf_喜讯、大唐锡林浩特发电厂660mw机组投产运行
查看>>
mysql多张表join_MySQL多表查询优化
查看>>
若有下列共用体定义_[十中优秀年级风采展】心中若有桃花源,何处不是水云间? 临沂第十中学八年级第六周线上教学记...
查看>>