EF的简单认识
EF的简单认识
EF简介
EntityFramwork是微软提供的一款ORM框架(Object Relational Mapping),实体映射模型,它的底层是ADO.NET的机制,使用EF将省去了我们对数据访问层的代码的编写,省去了对于SQLHelper等对数据库的操作逻辑,可以让我们把更多的时间放在上层方面的实现上。只要是操作数据的项目都可以使用EF简化对数据层的维护,类似的ORM框架还有很多比较轻量级的框架,此处没有研究。
EF的安装和使用问题
可以使用从微软的工具Nuget上直接获取,在EF的使用使用过程中,可能会遇到一些错误,本人在学习的时候就遇到了一些问题。
1.遇到创建EF数据模型文件的时候,发现没有ADO.NET实体数据模型的模板
解决方法:
在C:\ProgramData\Package Cache\下面搜索到EFTools.msi
vs2012对应的是EFTools V11
vs2013 对应的是EFTools V12
2.在使用EF6的时候,遇到编译错误
正在在编译转换:未能找到元数据文件“”%VS120COMNTOOLS..\IDE\EntityFramework.dll%
解决方案:
这类问题就是设置系统的环境变量VS120COMNTOOLS的设置的路径是不正确的,所以需要制定一个正确的路径,这个路径下一定要包含IDE文件夹,在IDE文件加下,一定要包含着相应的dll文件
我的电脑-右击属性-高级系统设置-高级-环境变量-选择系统变量中找到这个变量
我的正确设置的路径是E:\VS2013和Sql安装文件\VS2013Install\Common7,这个文件路径就是我的VS的安装目录没在这个目录的下一级就是IDE,里面已经包含着相应的Dll文件
EF的开发模式
DataBaseFirst
下面将使用空的Web演示操作步骤:
1.首先创建一个空的web应用程序
2.安装好以后,点击添加 数据-ADO.NET 实体模型,文件的后缀名字是model1.edmx,此时弹出来选择的类型:从数据库中生成:就是所谓的DataBaseFirst
空模型:ModelFirst
3.然后新建连接选择对应的数据库和表(对于敏感数据那一项直接打钩)
4.完成后会有几个文件添加进来
Model1.tt:T4模板,这个是代码生成工具,就是用来生成实体模型类,微软的代码生成工具的后缀名都是.tt
Model.edmx.diagram:这是和实体模型设计器相对应,用来描述模型的。
。。。
此时所有的需选择出的数据库中的表都已经在项目中生成相应的model,同时为我们生成一个数据操作类继承自DbContext
代码语法操作
添加数据:
Useruser=newUser();
user.UserName="zhaohongjian";
user.Password="123";
AddressListEntitiesdb=newAddressListEntities();//上下文对象,连接数据库和实体类
db.User.Add(user);
//db.User相当于一个内存数据
db.SaveChanges();//存取到数据库中
Response.Write(User.ID);//系统中默认的返回的是刚刚插入的数据的主键的ID,也就是说,可以获取到一些数据库中的信息,因为已经SaveChanges()了
AddressListEntities这个类是继承自DbContext类,当对象实例化的时候,会调用父类的构造函数,将连接字符串传入进去。在AddressListEntitie这个类中存在着
publicDbSet<User>User { get; set; },这个和数据库中的表示相连接的,也就是不改动的话,他们存放的数据是一样
注意:
Db.User.Add(user1);
Db.User.Add(user2);
Db.SaveChanged();
多次数据库的操作,但是EF只用操作一次就全部执行了,这是集成了工作组模式,大大减少了对于数据操作的频率,提高性能。同时SaveChange()方法内部实现了事务模式,出现失误会进行回滚操作
查询:
EF中的查询采用的是延迟加载的机制,也就是当使用的时候才会进行查询操作
EF中的查询是支持Linq的
protectedvoidButton2_Click(object sender, EventArgs e)
{
AddressListEntitiesentity=newAddressListEntities();
IQueryable<User>resultList=from cell in entity.User
where cell.UserName=="zhaohongjian"
select cell;//因为相当于连通器,所以可以直接操作内存中的模拟数据表,但是此时并没有用到相应的数据,所以此时并没有查询数据库
Response.Write(resultList.FirstOrDefault<User>().Password);//此时才会去查询数据库
}
删除:
1.先进行查询出想要删除的数据,然后使用删的API,无法直接构建一个user实例,直接删除,因为自己直接构建的user类实例,没有实现模拟表与数据库中表的映射。
//先查询
AddressListEntitiesentity=newAddressListEntities();
IQueryable<User>resultList=fromcellinentity.User
wherecell.UserName=="zhaohongjian"
selectcell;
//再删除
entity.User.Remove(resultList.FirstOrDefault());//这些操作只是在操作的内存中的模拟表
entity.SaveChanges();
2.使用自己定义的类的实例,然后手动绑定(Entry)
Useruser=newUser() { UserName="zhaohongjian" };
AddressListEntitiesdbContext=newAddressListEntities();
dbContext.Entry<User>(user).State=System.Data.EntityState.Deleted;//手动的打上标记,在内存的模拟表中删除,同时实现与数据库的映射,将user
dbContext.SaveChanges();
更新:
对于更新是没有对应的直接修改模拟表的Update方法,所以可以使用添加标记并删除模拟表的方式进行修改
具体的使用方式也是有两种,和删除的时候是类似的
- 先查询后更新(使用打标记更新)
- 自己构造然后打标记
AddressListEntitiesdbContext=newAddressListEntities();
Useruser=newUser() { UserName="zhaohongjian", Password="ddd" };
dbContext.Entry<User>(user).State=EntityState.Modified;
dbContext.SaveChanges();
ModelFirst
modelFirst的操作就是在创建ADO.NET实体数据模型的时候,选择的模板是空模板,此时将会直接载入Model1.tt,Model.edmx.diagram,然后直接在实体操作界面直接进行创建就好了,右击添加实体模型,然后可以使用右击-添加标量属性,添加普通的属性,同时可以使用F4直接调出属性界面,在里面对属性进行相应的设置,右击-添加导航属性,可以构建两个实体之间的关系,实现一对多等关系的映射,导航属性,可以使得模型之间可以相互调用。
当模型创建完毕之后,然后保存一下,应该就会生成相应的model文件(没显示出来也是没有关系的),然后右击-根据模型更新数据库,然后会生成相应的DDL文件
点击完成之后会产生xxx.sql文件,你可以直接在VS中执行这个文件,然后会在数据库生成相应的数据表,当然你可以将sql文件中的省sql语句考到sqlserver中去执行即可
具体的配置已经完毕,关于代码的使用,跟DataBaseFirst使用是一样的
注意事项:关于模型的修改,当重新添加一格model的时候,你需要再次操作根据模型生成数据,生成的sql文件一定不要着急的去执行,首先需要将前面的Drop语句删掉,因为EF会将你以前的表全部删除,然后全部重新生成,所有如果不删除的话,以前的数据将会丢失。对于某一个model中的属性的修改,直接在数据库中将表改一下,就可以了,没有必要操作“根据模型生成数据库”。
CodeFirst
其实就是我们用自己搭建代码的形式,将VS创建的过程完全的模拟出来,代码基本上都是按照VS自动生成的仿照。
创建相相应的codeFirst之前,添加相应的类库
System.ComponentModel.DataAnnotations.dll(这个类库是系统的,用来标记特性)
EntityFramework.dll(添加的EF的package中)
System.Data.Entity.dll(系统)
1.创建相应的实体类,并对实体类添加相应的特性
public classClass
{
[Key]
publicintId { get; set; }
[Required]
[StringLength(32)]
publicstringClassName { get; set; }
publicvirtualICollection<Student>StudentInfo { get; set; }
}
public classStudent
{
[Key]
publicintStudentId { get; set; }
[Required]
[StringLength(32)]
publicstringStudentName { get; set; }
publicvirtualClassClassInfo { get; set; }
}
2.配置config文件,主要是将数据库连接字符串添加到配置文件中
<connectionStrings >
<add name="connStr" connectionString="server=.;database=mm;uid=****;pwd=****" providerName="System.Data.SqlClient" />
</connectionStrings>
3.编写我们自己的数据访问上下文类,这个类必须继承自DbContext
public classMyDbContext:DbContext
{
publicMyDbContext()
: base("name=connStr")
{ }
protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder)
{
//这句代码的作用就是去除生成的数据中的表格是复数的形式,保持原来的命名
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
publicDbSet<Class>Class { get; set; }
publicDbSet<Student>Student { get; set; }
}
4.就可以直接使用了
classProgram
{
staticvoidMain(string[] args)
{
MyDbContextdbContext=newMyDbContext();
Classclass1=newClass { ClassName="赵家班" };
dbContext.Database.CreateIfNotExists();
dbContext.Class.Add(class1);
dbContext.SaveChanges ();
}
}
EF的简单认识的更多相关文章
- EF Core 简单使用介绍
EF Core 是一个ORM(对象关系映射),它使 .NET 开发人员可以使用 .NET对象操作数据库,避免了像ADO.NET访问数据库的代码,开发者只需要编写对象即可. EF Core 支持多种数据 ...
- 使用EF 的简单的增删改查
using DAL; using Model; using System; using System.Collections.Generic; using System.Linq; using Sys ...
- .net core EF的简单使用
1.在mysql中新建一个表 2.在控制台中装个EF包 Install-Package Pomelo.EntityFrameworkCore.MySql 3.新建一个Person类 4.创建DbCo ...
- EF 一个简单的使用
原文:https://www.cnblogs.com/leotsai/p/entity-framework-doesnt-need-additional-repository.html 花猫.NET的 ...
- .Net下EF的简单实现
1.连接SQLServer,创建数据库TestDB; 2.添加EF引用,点击工具-NuGet包管理器-管理解决方案的NuGet程序包, 搜索EntityFramework包,点击安装: 3.在Web. ...
- MongoDB 系列(一) C# 类似EF语法简单封装
之前写过一篇关于MongoDB的封装 发现太过繁琐 于是打算从新写一篇简易版 1:关于MongoDB的安装请自行百度,进行权限认证的时候有一个小坑,3.0之后授权认证方式默认的SCRAM-SHA-1模 ...
- .Net框架搭建:SQL Server EF MVC简单三层框架
https://blog.csdn.net/pukuimin1226/article/details/52313656
- EF CodeFirst简单实例
运行环境:VS2012,添加的EntityFramework为6.0.2 版本不用太关心,只要知道原理就行了: 基本代码就这几行: namespace ConsoleApplication1 { ...
- EF实现简单的增删改查
1.在项目中添加ADO.NET实体数据模型: 2.接着根据提示配置数据库连接,配置完毕之后项目中生成了大致如下的内容(EF6.x): 其中TestData.tt中的Consumer,Stores是创建 ...
随机推荐
- 利用Owin解决CORS报错问题
我的项目是vue + ASP.NET .在 Vue调试时,由于vue开启的调试用的服务器端口号 和 后台.NET程序的端口号是不同的,发送Ajax请求时,就会报错.这里就不提报错的原因了,网上有很多, ...
- Python爬取指定重量的快递价格
目录 一.获取查询接口 二.获取相关数据 三.编写爬虫脚本 四.查看查询效果 背景:现在这个时代,快递横飞.我们想寄一个快递,给出的选择也是多种多样的(根据快递的大小.送达的时间.寄送的距离及价格.公 ...
- 主席树——求区间第k个不同的数字(向右密集hdu5919)
和向左密集比起来向右密集只需要进行小小的额修改,就是更新的时候从右往左更新.. 自己写的被卡死时间.不知道怎么回事,和网上博客的没啥区别.. /* 给定一个n个数的序列a 每次询问区间[l,r],求出 ...
- UI---设置Activity背景为透明
1.在values下colors中设置透明颜色 <?xml version="1.0" encoding="utf-8"?> <resourc ...
- ***报错Class 'Redis' not found in(原创)
报错:Class 'Redis' not found in 这个报错,表明phpredis 扩展没有安装好,而不是redis没有安装 有没有安装成功这个扩展,可以通过phpinfo来查看. 解决问题的 ...
- Spark SQL官网阅读笔记
Spark SQL是Spark中用于结构化数据处理的组件. Spark SQL可以从Hive中读取数据. 执行结果是Dataset/DataFrame. DataFrame是一个分布式数据容器.然而D ...
- pytest(1)
安装就讲这么多,别的不多比比 第1个例子(基本法要了解): 这个例子中,还有一些需要注意的知识点: 1 pytest将在当前目录及其子目录中运行test _ * .py或* _test.py形式的所有 ...
- xss攻击与防御
一.XSS攻击 Cross Site Scripting跨站脚本攻击 利用js和DOM攻击. 盗用cookie,获取敏感信息 破坏正常页面结构,插入恶意内容(广告..) 劫持前端逻辑 DDos攻击效果 ...
- js实现放大效果
<!doctype html><html> <head> <meta charset="UTF-8"> <title>放 ...
- 重新拾取:TFS2017钉钉机器人源代码签入通知
http://www.cnblogs.com/79039535/p/9316791.html 现在很多公司办公都使用钉钉打卡签到,于是鉴于公司也使用钉钉就打算用钉钉来做一个源代码签入通知. 首先先去打 ...