/扩展:
//注意:添加数据库模型时候,一定要选择在连接字符串中包含敏感数据(就是密码啊什么的。)如果没有选择,连接字符串中没有密码,则得手动添加
//数据库和模型同步变化:双击数据库模型Model1.edmx ==》 空白处右击 ==》 选择:从数据库更新模型
//ORM三种创建方式:
//数据库优先(先创建数据库,再根据数据创建模型 ):添加=》新建项=》数据=》.net实体数据模型=》从数据库生成
//模型优先(先创建模型,再安装模型创建数据库):添加=》新建项=》数据=》.net实体数据模型=》空模板
//通俗的讲就是,由子类向父类转换是协变;由父类向子类转换是逆变。泛型也是一样。in(传入参数) 关键字表示可能逆变,out (输出参数)关键字表示可能协变。逆变和协变都是为类安全,安全不安,关键在使用谁父类?子类?
//扩展:
//微型ORM框架,比如:Dapper(针对sql server,高效率)/PetalPOCO(跨数据库),都是开源(不是简单的开发源代码,是有开源社区,有自由程序员相互交流,有一套活着的问答机制,使得项目不断的进步壮大),互联网更喜欢拥抱开源,没事多逛逛社区才能看到新技术
//基于互联网项目和基于企业内部的项目是不一样的。
//上下文,在MVC4_lx\Models\Model1.Context.tt
//上下文可以理解为一个数据库,通过这个数据库可以操作这个数据库中的表
AEntities a_context;
//表实例,在MVC4_lx\Models\Model1.tt
//:base调用父类构造函数
//codeFirst(代码优先)
//这个模式适合老项目,可以最少改动的把实现EF引入
//代码优先,不用数据库和模型,直接写代码,根据代码生成数据库和模型。
//这个方式有些麻烦,但可以跨数据库-------------------------------------------非常好,.net不用任何修改,换下连接字符串,就可以实现跨数据库,牛逼..
//数据库要启动TCP/IP通信协议,才可以通过IP访问数据库(默认是启动的),而Named Popes 协议就是微软直接的通信协议(也是默认启动),反正要明白能连接数据库是因为实现了特点的通信协议
//在web.fonfig中创建连接字符串
//1.手写数据模型,这样用已有的M_1.cs吧
//2.写上下文类,在里面修改父类方法指定连接字符串
//3.添加各种引用,(可以创建空模型自动添加引入,再把模型删除就OK了)
//4.new出上下文,通过.Database.CreateIfNotExists(); //创建数据库
//EF框架基本基础市场上大部分数据库
//增删改查的操作===》ObjectContext(DbContext)
//ObjectContext(DbContext)===>操作XML映射(实体O,表R,映射M)===》生成SQL脚本
//ObjectContext(DbContext)===>传入生成的脚本===》操作数据库
//所以ObjectContext(DbContext)就是一个中间执行的类,里面就包含着一个隐藏的驱动层,就是这驱动层使得EF有操作各种数据库的能力,最终调用的是ADO.net
//上下文的一种加载类数据的缓存,多个线程同时读取修改容易出问题,一般是这么处理的:
//web中一个请求用一个上下文
//winForm中最好是用using
//web中一个请求只用一个上下文:
public static AEntities myDbContext()
{
//HttpContext本身就是保证安全线程,存在一个线程中存在一个HttpContext,其他线程的HttpContext是无法访问本线程的HttpContext,只有一个实例,所以就保证了上下文实例也是唯一的。
AEntities context = HttpContext.Current.Items["myDbContext"] as AEntities; //获取实例中的上下文
if (context == null)
{
context = new AEntities();
HttpContext.Current.Items.Add("myDbContext", context);//没有上下文就给他加一个上下,这个和缓存保持登陆状态的办法是一个意思
}
return context;
}