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 保证线程内唯一 上下文的创建的更多相关文章

  1. EF上下文对象创建之线程内唯一

    在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,那么会造成数据混乱,每次创建的对象执行相应的数据库操作,此同时,其他的EF对象内获得的数据可能已经是“过期”的了.即这个数据已经变动 ...

  2. MVC+Ef项目(3) 抽象数据库访问层的统一入口;EF上下文线程内唯一

    抽象一个数据库访问层的统一入口(类似于EF的上下文,拿到上下文,就可以拿到所有的表).实际这个入口就是一个类,类里面有所有的仓储对应的属性.这样,只要拿到这个类的实例,就可以点出所有的仓储,我们在 R ...

  3. ASP.net如何保证EF操作类线程内唯一

    说到线程内唯一,肯定会想到单例模式,但是如果多用户访问网站就会出现问题.ASP.net中有两种方法可以保证EF操作类线程内唯一(目前只会这两种,以后有好的方法再添加): 1.httpcontext(实 ...

  4. C# 如何保证对象线程内唯一:数据槽(CallContext)

    如果说,一个对象保证全局唯一,大家肯定会想到一个经典的设计模式:单例模式,如果要使用的对象必须是线程内唯一的呢? 数据槽:CallContext,ok看下msdn对callcontent的解释. Ca ...

  5. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建  ...

  6. C# 如何保证对象线程内唯一:数据槽(CallContext)【转载】

    如果说,一个对象保证全局唯一,大家肯定会想到一个经典的设计模式:单例模式,如果要使用的对象必须是线程内唯一的呢? 数据槽:CallContext,ok看下msdn对callcontent的解释. Ca ...

  7. 如何保证对象线程内唯一:数据槽(CallContext)

    CallContext 是类似于方法调用的线程本地存储区的专用集合对象,并提供对每个逻辑执行线程都唯一的数据槽.数据槽不在其他逻辑线程上的调用上下文之间共享.当 CallContext 沿执行代码路径 ...

  8. .Net普通三层 到 工厂模式->线程内唯一+单元工作模式->WebService分布式三层

    在软件世界分层的思想无处不在 主要是为了提高软件系统的维护性,扩展性,复用性和解耦等 软件的三层构架是一种最基本的分层思想的体现 结构图大体如下: 如此一来,开发人员可以只关注其中一层,而无需关心下一 ...

  9. .Net普通三层->工厂模式->线程内唯一+单元工作模式->WebService分布式三层

    在软件世界分层的思想无处不在 主要是为了提高软件系统的维护性,扩展性,复用性和解耦等 软件的三层构架是一种最基本的分层思想的体现 结构图大体如下: 如此一来,开发人员可以只关注其中一层,而无需关心下一 ...

随机推荐

  1. [C++11][算法][穷举]输出背包问题的所有可满足解

    关于背包问题的题目,前人之述备矣,这里只讨论实现 输入: n ca w_1 v_1 w_2 v_2 ... w_n v_n 其中,n是物品总数,ca是背包大小,w_n是第n个物品的重量,v_n是第n个 ...

  2. node 关键点总结

    1.I/O密集的地方尽量不要用require.(require是同步I/O操作) eg:正在运行一个HTTP服务器,如果在每个进入的请求上都用了require,就会遇到性能问题.所以通常在程序最初加载 ...

  3. jquery:closest和parents的主要区别

    closest和parents的主要区别是:1,前者从当前元素开始匹配寻找,后者从父元素开始匹配寻找:2,前者逐级向上查找,直到发现匹配的元素后就停止了,后者一直向上查找直到根元素,然后把这些元素放进 ...

  4. Linux学习总结

    1.软链接和硬链接 ln 命令可用来创建硬链接或是符号链接.它的使用方式有两种. ln file link 用来创建硬链接 ln -s item link 用来创建符号链接,这里的item可以是文件也 ...

  5. H5移动前端开发常用高能css3汇总

    1.禁止a标签点击高亮,这些都是非官方属性,但实用性超强 html,body{ -webkit-touch-callout: none; //禁止或显示系统默认菜单 -webkit-user-sele ...

  6. c语言指针疑惑[转载]

    c99的动态数组是在栈上面开辟的,而new出来的是在堆上面开辟的.栈和堆的地址是从两端相向增长的.栈很小,一般只有几十k,vc6好像是64k.堆很大,在win32的虚拟地址空间可以分配到2g的内存.栈 ...

  7. Java知识结构

  8. osg中内嵌QtBrowser

    最近看到osg Examples的osgQtBrowser例子, 觉得效果还是挺好的, 想加入到自己的项目中来, 就这样的搬运工作也出问题了-__- 拷过来的是这一段: osg::ref_ptr< ...

  9. 移动端lCalendar纯原生js日期时间选择器

    网上找过很多的移动端基于zepto或jquery的日期选择器,在实际产品中也用过一两种,觉得都不太尽如人意,后来果断选择了H5自己的日期input表单,觉得还可以,至少不用引用第三方插件了,性能也不错 ...

  10. 02.JavaScript基础上

    JavaScript组成 ECMAScript:解释器.翻译 .平时我们写的代码都是用英文数字之类,而计算机只能读懂0和1,ECMAScript可以把我们写的翻译给计算机,把计算机写的传达给我们DOM ...