EF 保证线程内唯一 上下文的创建
1、ef添加完这个对象,就会自动返回这个对象数据库的内容,比如下面这个表是自增ID
最后打印出来的ID 就是自增的结果
2、lambda 中怎么select *
- var userInfoList = from u in db.UserInfo
- where u.ID ==
- select u;
3、返回类型 IQueryable<T>
它继承 IEnumerable<T> 相当于集合
延迟加载机制 用到的时候才去数据库查
4、两种删除标记
- db.UserInfo.Remove(userInfo);
- db.Entry<UserInfo>(userInfo).State = System.Data.EntityState.Deleted;
5、删除的时候可以不用先查数据库
- UserInfo userInfo = new UserInfo() {ID=};
- //db.UserInfo.Remove(userInfo);//这样不能用remove 只能用State,Remove必须先查出来
- db.Entry<UserInfo>(userInfo).State = System.Data.EntityState.Deleted;
- db.SaveChanges();
6、modelfirst 生成ddl 了解dml ddl dcl区别
在生成的时候(vs2012 sqlserver2008很可能会出错)http://www.bubuko.com/infodetail-1266884.html
7、导航属性
订单属于哪个人 外键会自动添加这个人的ID
savechange 设计模式:工作单元模式 :一个业务对多张表的操作,只连一次数据库,完成条记录的更新
- Model2Container db = new Model2Container();
- //人
- Customer customer = new Customer() {CustomerName="zhangsan",CustomerPwd="", SubTime=DateTime.Now };
- //订单
- OrderInfo orderInfo1 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "", CreateDateTime = DateTime.Now,Customer=customer };
- OrderInfo orderInfo2 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "", CreateDateTime = DateTime.Now, Customer = customer };
- db.Customer.Add(customer);
- db.OrderInfo.Add(orderInfo1);
- db.OrderInfo.Add(orderInfo2);
- db.SaveChanges();//默认的已经开启了事务。 工作单元模式。(UnitOfwork)
Orderinfor 是Customer的导航属性
- Model2Container db = new Model2Container();
- var customerList = from c in db.Customer
- select c;
- foreach (var customer in customerList)
- {
- Response.Write(customer.CustomerName+":");
- foreach (var orderInfo in customer.OrderInfo)//延迟加载。
- {
- Response.Write(orderInfo.OrderNum);
- }
- }
不过 导航属性效率比较低,检测sqlserver发现是 查询两次
下面的写法好些
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- namespace WebApplication1
- {
- public partial class WebForm2 : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- }
- //创建一个人 添加俩订单
- protected void Button1_Click(object sender, EventArgs e)
- {
- Model2Container db = new Model2Container();
- //人
- Customer customer = new Customer() {CustomerName="zhangsan",CustomerPwd="", SubTime=DateTime.Now };
- //订单
- OrderInfo orderInfo1 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "", CreateDateTime = DateTime.Now,Customer=customer };
- OrderInfo orderInfo2 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "", CreateDateTime = DateTime.Now, Customer = customer };
- db.Customer.Add(customer);
- db.OrderInfo.Add(orderInfo1);
- db.OrderInfo.Add(orderInfo2);
- db.SaveChanges();//默认的已经开启了事务。 工作单元模式。(UnitOfwork)
- }
- //打印出所有人的订单号
- protected void Button2_Click(object sender, EventArgs e)
- {
- Model2Container db = new Model2Container();
- var customerList = from c in db.Customer
- select c;
- foreach (var customer in customerList)
- {
- Response.Write(customer.CustomerName+":");
- foreach (var orderInfo in customer.OrderInfo)//延迟加载。
- {
- Response.Write(orderInfo.OrderNum);
- }
- }
- }
- //打印出这个人的订单号
- protected void Button3_Click(object sender, EventArgs e)
- {
- Model2Container db = new Model2Container();
- //var customerInfoList = from c in db.Customer
- // where c.ID == 1
- // select c;
- //var customerInfo = customerInfoList.FirstOrDefault();
- //foreach (var orderInfo in customerInfo.OrderInfo)
- //{
- // Response.Write(orderInfo.OrderNum);
- //}
- var orderInfoList = from o in db.OrderInfo
- where o.CustomerID ==
- select o;
- foreach (var orderInfo in orderInfoList)
- {
- Response.Write(orderInfo.OrderNum);
- }
- }
- //打印出这个订单的客户名称
- protected void Button4_Click(object sender, EventArgs e)
- {
- Model2Container db = new Model2Container();
- var orderInfoList = from o in db.OrderInfo
- where o.OrderNum == ""
- select o;
- var orderInfo = orderInfoList.FirstOrDefault();
- Customer customer = orderInfo.Customer;
- Response.Write(customer.CustomerName);
- }
- //删除某个客户下的 所有的订单
- protected void Button5_Click(object sender, EventArgs e)
- {
- Model2Container db = new Model2Container();
- //var customer = (from c in db.Customer
- // where c.ID == 1
- // select c).FirstOrDefault();
- //var orderInfoList = customer.OrderInfo;
- //while (orderInfoList.Count > 0)
- //{
- // var orderInfo = orderInfoList.FirstOrDefault();
- // db.Entry<OrderInfo>(orderInfo).State = System.Data.EntityState.Deleted;
- //}
- //db.SaveChanges();
- var orderList = from o in db.OrderInfo
- where o.CustomerID ==
- select o;
- }
- }
- }
简单查询:var result = from c in Entities.Customer select c;
条件查询:
普通linq写法: var result = from c in Entities.Customer where c.Gender ==‘w’ select c;
Lambda表达式写法: var result = from c in Entities.Customer.Where<Customer>(c =>c.Gender==‘w’);
排序分页写法:
- IQueryable<Customers> cust10 = (from c in customers
- orderby c.CustomerID
- select c).Skip().Take();
左外连接:可以的连接有Join 和 GroupJoin 方法。GroupJoin组联接等效于左外部联接,它返回第一个(左侧)数据源的每个元素(即使其他数据源中没有关联元素)。
- var query = from d in edm.Order_Details
- join order in edm.Orders
- on d.OrderID equals order.OrderID
- select new
- {
- OrderId = order.OrderID,
- ProductId = d.ProductID,
- UnitPrice = d.UnitPrice
- };
8、操作方式
dbfirst 连接数据库 映射对象(edmx)
modelfirt 创建空数据模型(edmx) 添加模型 右键根据模型生成数据库
9、codefirt 根据连接字符串 自动创建数据库
vs 2012 可以直接添加一个空的模型自动添加引用 其他的版本 不可以
学生表
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace CodeFirstDemo
- {
- public class StudentInfo
- {
- [Key] //主键
- public int Id { get; set; }
- [StringLength()] //指定长度
- [Required] //不可为空
- public string StuName { get; set; }
- [Required] //不可为空
- public DateTime SubTime { get; set; }
- //关系 一个班级可以有多个学生
- public virtual ClassInfo ClassInfo { get; set; }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace CodeFirstDemo
- {
- public class ClassInfo
- {
- [Key]
- public int Id { get; set; }
- [StringLength()]
- [Required]
- public string ClassName { get; set; }
- [Required]
- public DateTime CreateTime { get; set; }
- //导航属性 一个班级有多个学生
- public virtual ICollection<StudentInfo> StudentInfo { get; set; }
- }
- }
数据库上线文 daset 表示对这个类有curd权限
- using System;
- using System.Collections.Generic;
- using System.Data.Entity;
- using System.Data.Entity.ModelConfiguration.Conventions;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace CodeFirstDemo
- {
- public class CodeFirstDbContext:DbContext
- {
- //connStr 连接字符串
- public CodeFirstDbContext()
- : base("name=connStr")
- {
- }
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- //不加这句话,自动创建的表后边都有s 如 classinfo->classsinfos
- modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
- }
- public DbSet<ClassInfo> ClassInfo { get; set; }
- public DbSet<StudentInfo> StudentInfo { get; set; }
- }
- }
主程序 有则不创建数据库 没有则创建
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace CodeFirstDemo
- {
- class Program
- {
- static void Main(string[] args)
- {
- CodeFirstDbContext db = new CodeFirstDbContext();
- db.Database.CreateIfNotExists();//没有数据库自动创建,有则不
- ClassInfo classInfo = new ClassInfo();
- classInfo.ClassName = "0413班";
- classInfo.CreateTime = DateTime.Now;
- db.ClassInfo.Add(classInfo);
- db.SaveChanges();
- }
- }
- }
保证线程内唯一
为了保证有两个EF上下文 F1 F2都改了集合 而F1先savechange,F2再保存就会发生冲突
解决方案:单列模式 只new一次
以上解决方案错误,所有人拿到一个实例,所有人都往上下文类添加数据,越来越大,内存会爆,服务器会瘫,还不能释放,一个人释放了,其他人就废了
所以
解决方案:线程内唯一
httpContext 是通过 callContext保证线程内唯一的
其实写httpContext也是可以的
- using CZBK.HeiMaOA.Model;
- using System;
- using System.Collections.Generic;
- using System.Data.Entity;
- using System.Linq;
- using System.Runtime.Remoting.Messaging;
- using System.Text;
- using System.Threading.Tasks;
- namespace CZBK.HeiMaOA.DAL
- {
- public class DBContextFactory
- {
- /// <summary>
- /// 保证在一次请求过程中只创建一次EF上下文实例.
- /// </summary>
- /// <returns></returns>
- public static DbContext CreateDbContext()
- {
- DbContext dbContext = (DbContext)CallContext.GetData("dbContext");
- if (dbContext == null)
- {
- dbContext = new OAEntities();
- CallContext.SetData("dbContext", dbContext);
- }
- return dbContext;
- }
- }
- }
- using CZBK.HeiMaOA.Model;
- using System;
- using System.Collections.Generic;
- using System.Data.Entity;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace CZBK.HeiMaOA.DAL
- {
- public class BaseDal<T>where T:class,new()
- {
- // OAEntities Db = new OAEntities();
- DbContext Db = DBContextFactory.CreateDbContext();//完成EF上下文创建.
- /// <summary>
- /// 基本查询方法
- /// </summary>
- /// <param name="whereLambda"></param>
- /// <returns></returns>
- public IQueryable<T> LoadEntities(System.Linq.Expressions.Expression<Func<T, bool>> whereLambda)
- {
- return Db.Set<T>().Where<T>(whereLambda);
- }
- /// <summary>
- /// 分页方法
- /// </summary>
- /// <typeparam name="s">排序的约束</typeparam>
- /// <param name="pageIndex">当前页码</param>
- /// <param name="pageSize">每页显示记录数</param>
- /// <param name="totalCount">总条数</param>
- /// <param name="whereLambda">过滤条件</param>
- /// <param name="orderbyLambda">排序条件</param>
- /// <param name="isAsc">排序方式</param>
- /// <returns></returns>
- public IQueryable<T> LoadPageEntities<s>(int pageIndex, int pageSize, out int totalCount, System.Linq.Expressions.Expression<Func<T, bool>> whereLambda, System.Linq.Expressions.Expression<Func<T, s>> orderbyLambda, bool isAsc)
- {
- var temp = Db.Set<T>().Where<T>(whereLambda);
- totalCount = temp.Count();
- if (isAsc)//如果成立表示升序
- {
- temp = temp.OrderBy<T, s>(orderbyLambda).Skip<T>((pageIndex - ) * pageSize).Take<T>(pageSize);
- }
- else
- {
- temp = temp.OrderByDescending<T, s>(orderbyLambda).Skip<T>((pageIndex - ) * pageSize).Take<T>(pageSize);
- }
- return temp;
- }
- /// <summary>
- /// 删除数据
- /// </summary>
- /// <param name="entity"></param>
- /// <returns></returns>
- public bool DeleteEntity(T entity)
- {
- Db.Entry<T>(entity).State = System.Data.EntityState.Deleted;
- // return Db.SaveChanges() > 0;
- return true;
- }
- /// <summary>
- /// 更新
- /// </summary>
- /// <param name="entity"></param>
- /// <returns></returns>
- public bool UpdateEntity(T entity)
- {
- Db.Entry<T>(entity).State = System.Data.EntityState.Modified;
- // return Db.SaveChanges() > 0;
- return true;
- }
- /// <summary>
- /// 添加数据
- /// </summary>
- /// <param name="entity"></param>
- /// <returns></returns>
- public T AddEntity(T entity)
- {
- Db.Set <T>().Add(entity);
- //Db.SaveChanges();
- return entity;
- }
- }
- }
- //httpContext是线程内唯一
- //这样保证EF上下文线程内唯一
- EFFristModelEntities db = null;
- if (HttpContext.Current.Items["db"] == null)
- {
- db = new EFFristModelEntities();
- HttpContext.Current.Items["db"] = db;
- }
- else
- {
- db = HttpContext.Current.Items["db"] as EFFristModelEntities;
- }
EF 执行SQL
- using System;
- using System.Collections.Generic;
- using System.Data.SqlClient;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace CZBK.ItcastOA.BLL
- {
- public partial class KeyWordsRankService:BaseService<Model.KeyWordsRank>,IBLL.IKeyWordsRankService
- {
- /// <summary>
- /// 将统计的明细表的数据插入。
- /// </summary>
- /// <returns></returns>
- public bool InsertKeyWordsRank()
- {
- string sql = "insert into KeyWordsRank(Id,KeyWords,SearchCount) select newid(),KeyWords,count(*)
- from SearchDetails where DateDiff(day,SearchDetails.SearchDateTime,getdate())<=
- group by SearchDetails.KeyWords";
- return this.CurrentDBSession.ExecuteSql(sql)>;
- }
- /// <summary>
- /// 删除汇总中的数据。
- /// </summary>
- /// <returns></returns>
- public bool DeleteAllKeyWordsRank()
- {
- //用这句删除表中的数据是非常快的
- string sql = "truncate table KeyWordsRank";
- return this.CurrentDBSession.ExecuteSql(sql)>;
- }
- public List<string> GetSearchMsg(string term)
- {
- //KeyWords like term%
- string sql = "select KeyWords from KeyWordsRank where KeyWords like @term";
- return this.CurrentDBSession.ExecuteQuery<string>(sql, new SqlParameter("@term",term+"%" ));
- }
- }
- }
EF 返回datatable
- /// <summary>
- /// EF SQL 语句返回 dataTable
- /// </summary>
- /// <param name="db"></param>
- /// <param name="sql"></param>
- /// <param name="parameters"></param>
- /// <returns></returns>
- public static DataTable SqlQueryForDataTatable(this Database db,
- string sql,
- SqlParameter[] parameters)
- {
- SqlConnection conn = new System.Data.SqlClient.SqlConnection();
- conn.ConnectionString = db.Connection.ConnectionString;
- if (conn.State != ConnectionState.Open)
- {
- conn.Open();
- }
- SqlCommand cmd = new SqlCommand();
- cmd.Connection = conn;
- cmd.CommandText = sql;
- if (parameters.Length>)
- {
- foreach (var item in parameters)
- {
- cmd.Parameters.Add(item);
- }
- }
- SqlDataAdapter adapter = new SqlDataAdapter(cmd);
- DataTable table = new DataTable();
- adapter.Fill(table);
- return table;
- }
调用如下
- protected void Page_Load(object sender, EventArgs e)
- {
- if (!IsPostBack)
- {
- GridView1.DataSource = GetDataTable();
- GridView1.DataBind();
- }
- }
- public DataTable GetDataTable()
- {
- GardenHotelContext context = new GardenHotelContext();
- int LanType = ;
- int state = ;
- SqlParameter[] sqlparams=new SqlParameter[];
- sqlparams[]=new SqlParameter("LanType",LanType);
- sqlparams[]=new SqlParameter("state",state);
- DataTable DataTable = context.Database.SqlQueryForDataTatable("select LeaveName,LeaveEmail from LeaveInfo where LanType=@LanType and State=@State", sqlparams);
- return DataTable;
- }
另一种方法
- public DataTable GetDataTable2()
- {
- GardenHotelContext context = new GardenHotelContext();
- var list = (from l in context.LeaveInfoes
- group l by l.LanType into g
- select new
- {
- g.Key,
- num = g.Count()
- }).ToList();
- return PubClass.ListToDataTable(list);
- }
- #region 反射List To DataTable
- /// <summary>
- /// 将集合类转换成DataTable
- /// </summary>
- /// <param name="list">集合</param>
- /// <returns></returns>
- public static DataTable ListToDataTable(IList list)
- {
- DataTable result = new DataTable();
- if (list.Count > )
- {
- PropertyInfo[] propertys = list[].GetType().GetProperties();
- foreach (PropertyInfo pi in propertys)
- {
- result.Columns.Add(pi.Name, pi.PropertyType);
- }
- for (int i = ; i < list.Count; i++)
- {
- ArrayList tempList = new ArrayList();
- foreach (PropertyInfo pi in propertys)
- {
- object obj = pi.GetValue(list[i], null);
- tempList.Add(obj);
- }
- object[] array = tempList.ToArray();
- result.LoadDataRow(array, true);
- }
- }
- return result;
- }
- #endregion
http://www.cnblogs.com/wlflovenet/archive/2011/12/30/EF11.html
linq 包括方法语法(lambda格式) 查询语法
帮助文档推荐尽可能使用查询语法也就是正经linq格式
from n in list
where n.StartWith("s")
orderby n //查询方法排序 按照N排序
select n;
找到集合中以S开头的
方法语法排序
var result=list.OrderBy(n=>n).where(...)
倒序:orderByDescending()
EF 保证线程内唯一 上下文的创建的更多相关文章
- EF上下文对象创建之线程内唯一
在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,那么会造成数据混乱,每次创建的对象执行相应的数据库操作,此同时,其他的EF对象内获得的数据可能已经是“过期”的了.即这个数据已经变动 ...
- MVC+Ef项目(3) 抽象数据库访问层的统一入口;EF上下文线程内唯一
抽象一个数据库访问层的统一入口(类似于EF的上下文,拿到上下文,就可以拿到所有的表).实际这个入口就是一个类,类里面有所有的仓储对应的属性.这样,只要拿到这个类的实例,就可以点出所有的仓储,我们在 R ...
- ASP.net如何保证EF操作类线程内唯一
说到线程内唯一,肯定会想到单例模式,但是如果多用户访问网站就会出现问题.ASP.net中有两种方法可以保证EF操作类线程内唯一(目前只会这两种,以后有好的方法再添加): 1.httpcontext(实 ...
- C# 如何保证对象线程内唯一:数据槽(CallContext)
如果说,一个对象保证全局唯一,大家肯定会想到一个经典的设计模式:单例模式,如果要使用的对象必须是线程内唯一的呢? 数据槽:CallContext,ok看下msdn对callcontent的解释. Ca ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ...
- C# 如何保证对象线程内唯一:数据槽(CallContext)【转载】
如果说,一个对象保证全局唯一,大家肯定会想到一个经典的设计模式:单例模式,如果要使用的对象必须是线程内唯一的呢? 数据槽:CallContext,ok看下msdn对callcontent的解释. Ca ...
- 如何保证对象线程内唯一:数据槽(CallContext)
CallContext 是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽.数据槽不在其他逻辑线程上的调用上下文之间共享.当 CallContext 沿执行代码路径 ...
- .Net普通三层 到 工厂模式->线程内唯一+单元工作模式->WebService分布式三层
在软件世界分层的思想无处不在 主要是为了提高软件系统的维护性,扩展性,复用性和解耦等 软件的三层构架是一种最基本的分层思想的体现 结构图大体如下: 如此一来,开发人员可以只关注其中一层,而无需关心下一 ...
- .Net普通三层->工厂模式->线程内唯一+单元工作模式->WebService分布式三层
在软件世界分层的思想无处不在 主要是为了提高软件系统的维护性,扩展性,复用性和解耦等 软件的三层构架是一种最基本的分层思想的体现 结构图大体如下: 如此一来,开发人员可以只关注其中一层,而无需关心下一 ...
随机推荐
- 算法系列:FFT 002
转载自http://blog.jobbole.com/58246/ 快速傅里叶变换(Fast Fourier Transform)是信号处理与数据分析领域里最重要的算法之一.没有正规计算机科学课程背景 ...
- 关联挖掘和Aprioir算法
Apriori算法 优点:易编码实现 缺点:在大数据集上可能较慢 适用数据类型:数值型或者标称型 算法过程: 关联分析是一种在大规模数据集中寻找有意思的关系的任务,这里的有意思的关系有两种:频繁项集( ...
- post NSURLConnection请求网络数据
#import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...
- 《DSP using MATLAB》示例Example5.16
代码: x1 = [1,2,2,1]; x2 = [1,-1,-1,1]; x3 = conv(x1,x2); % N = 5 n1 = 0:1:length(x1)-1; n2 = 0:1:leng ...
- 10 Cookie/Session
JSP/EL入门 * SUN提供了开发WEB资源的技术 Servlet/JSP * response.getWriter().write(); ...
- Superslide插件无效的问题
用Superslide像往常那样导入JQ和SuperSlide后,首页焦点图不会变,就像SuperSlide失效了一样,为什么??? 排查了一圈最后发现是JS导入顺序的问题,必须先导入JQ,再导入Su ...
- Model Validation in ASP.NET Web API
Model Validation in ASP.NET Web API 原文:http://www.asp.net/web-api/overview/formats-and-model-binding ...
- jquery点击元素之外触发事件
$("#errorMsg_layer").bind("click",function(e){ if($(e.target).closest("#err ...
- Python数据库迁移脚本(终极版)
上次的那几个脚本这次全部整合到了一起,而且后面发现了一个可以使用的ODBC包,于是这次采用的方式就很简单了,直接通过ODBC将InterBase数据库中的数据全部取出来之后通过Python的sqlal ...
- ZeroMQ接口函数之 :zmq_proxy_steerable – 以STOP/RESUME/TERMINATE控制方式开启内置的ZMQ代理
ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ——————————————————————————————————— ...