[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="data source=.;initial catalog=HX_Shop;persist security info=True;user id=sa;password=123456;MultipleActiveResultSets=True;App=EntityFramework"" 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() > ;
}
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() > ;
} 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 - ))
.Take(pageSize)
.AsQueryable();
}
else
{
result = result.OrderByDescending(orderBy)
.Skip(pageSize * (pageIndex - ))
.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;
}
}
[ASP.NET MVC]: - EF框架学习手记的更多相关文章
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(9)-TT模板的学习 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2): ...
- EF框架学习手记
转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(22)-为用户设置角色
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列
http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
随机推荐
- [git]通过commit_id找回文件
git checkout commit_id 这样会切换到这个commit_id的上,文件的内容就是这个commit保存的内容. git checkout -b new_branch_name com ...
- python内置模块(1)
Python的模块在其它语言中通常称为库或类库,也就是lib.它是编程语言的第三级封装,第四级则是包,也就是模块的打包组合,而前两级分别是函数和类.封装的好处,自然不用多言,高内聚,松耦合,减少代码重 ...
- android 获取当前位置
1. Android开发位置感知应用程序方式:1. GPS 定位 精确度高,仅适用于户外,严重消耗电量.如果手机内置GPS接受模块,即使手机处于信号盲区,依然可以获取位置信息. 2. NETW ...
- Servelet面试题
1. Servlet与JSP有什么区别? Servlet和JSP完成的功能是相同的,都可以接收用户的请求,可以对用户进行响应,可以调用业务方法. 不同点在于JSP是在html或者xml中嵌入了Java ...
- Windows 64位操作系统和32位操作系统在注册表上的有一点不一样
Windows 64位操作系统为提供对32位应用程序的兼容,在“C:\Windows\SysWOW64”目录下保留了很多32位的工具(如CMD.exe是32位的).在Windows 64位操作系统上跑 ...
- ASP.NET 取得 Uri 各项属性值
Uri uri = new Uri("http://www.yoercn.com/aboutus/idea.html");string Host = uri.Host; ...
- 晒自己做的一个管理系统(清新风格)EasyUI
最近项目结束了,现在也要自己总结一下自己的成果了,总结会加深自己对项目的印象的.这里我就先晒一些作品图片了,希望大家看了会赞美一个! 项目虽然结束了,但是接下来的这个项目可就不是我一个人可以搞定的了, ...
- NameValueCollection类集合
1.NameValueCollection类集合是基于 NameObjectCollectionBase 类. 但与 NameObjectCollectionBase 不同,该类在一个键下存储多个字符 ...
- MySQL Query Profile
MySQL Query Profiler, 可以查询到此 SQL 语句会执行多少, 并看出 CPU/Memory 使用量, 执行过程 System lock, Table lock 花多少时间等等.从 ...
- 继续寻找app开发的技术方案
大概12年下半年开始,才有app开发已经来到身边的感觉. 但也一直只是感觉,没想到自己得亲身上阵. 由于要一个人做(帮朋友倒腾倒腾),而且要跨平台,而且前后台都要弄,而且时间有限. 最终选了web方式 ...