MVC系列学习(二)-初步了解ORM框架-EF
1.新建 一个控制台项目
2.添加一个数据项

a.选择数据库
注:数据库中的表如下:


b.选择EF版本

c.选择表

3.初步了解EF框架
看到了多了一个以 edmx后缀的文件

在edmx文件上,右击打开方式,选择 XML(文本)编辑器 打开
该xml主要包含三部分:(数据库存储模型,实体模型,关系映射)
edmx还为我们生成了两个tt模板
| 数据库存储模型: 该模型有个实体容器EntityContainer, 它的Name属性为SchoolModelStoreContainer, EntityType属性的值为Self.Student,即<EntityType Name=”Student”></EntityType>中的数据 |

| 概念实体模型: 该模型有个实体容器EntityContainer, 它的Name属性为SchoolEntities, EntityType属性的值为Self.Student,即<EntityType Name=”Student”></EntityType>中的数据 |

| 映射关系 EntityContainerMapping:指定了映射的两个模型SchoolModelStoreContainer和SchoolEntities, 【指定了 数据库 与 实体对象】 EntitySetMpping:指定了实体集中的哪个实体,即Name为Student的 概念实体集 EntityTypeMapping:指定了数据库中那张表,即Name为Student的 表 MappingFragment:指定了 实体中属性 与 相应表中具体列的 对应关系 |

接下来,看看这两个tt模板
a.首先看上下文模板(StudentModel.Context.tt)

通过读取edmx的中的配置信息,生成了EF上下文对象,即StudentModel.Context.cs
【可以理解为,提供给程序员操作数据库的一个接口】
b.实体tt模板

读取edmx中的配置,生成各实体,最终生成实体类,即Student.cs
4.了解了EF中的映射关系,接下来用代码再解释一下
首先看一张图,了解EF在我们实际操作中的具体位置,发现在数据库与实体对象之间

下面就用上图的解释,来写增删改查
增,代码如下:
private static void Add()
{
//1.0获得要添加的对象
Student stu = new Student() { Age = 1, Name = "张三1" };
//2.0将该实体“detached”到包装类对象中
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
//3.0设置该包装类中 标志为 添加
entry.State = EntityState.Added;
//4.0EF根据 实体中 各属性的 标识,生成相应的sql语句
dbContext.SaveChanges();
}
用Sql server profiler监视EF为我们生成的sql代码,代码如下
因为给整个包装类 的所有属性设置了 Added,所以属性Name和Age 就会被插入插入到数据库
exec sp_executesql N'INSERT [dbo].[Student]([Name], [Age])
VALUES (@0, @1)
SELECT [Id]
FROM [dbo].[Student]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()',N'@0 nvarchar(50),@1 int',@0=N'张三1',@1=1
查,代码如下:
private static void Query()
{
//用标准查询语句,查出Id为1的所有的学生
//用EF查询方法,实际创建的是 某个实体类的代理类,代理类 继承于 该实体类
Student stu = dbContext.Students.Where(s => s.Id == 1).Select(s => s).FirstOrDefault();
Console.WriteLine(stu.Name + "有" + stu.Age+"岁");
}
用Sql server profiler监视EF为我们生成的sql代码,代码如下
SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent1].[Age] AS [Age]
FROM [dbo].[Student] AS [Extent1]
WHERE 1 = [Extent1].[Id]
改,代码如下
private static void Edit()
{
//1.先查出要修改的对象
Student stu = dbContext.Students.Where(s => s.Id == 2).FirstOrDefault();
//2.将实体 添加到包装类中,并设置对象包装类的 标识为 unchanged
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
//3.修改内容
stu.Name = "kim";
//3.1设置对象的 要修改的属性 为要修改
entry.Property("Name").IsModified = true;
//4.EF根据,包装类 中的 对象的属性的标识,来生成相应的sql语句
dbContext.SaveChanges();
}
用Sql server profiler监视EF为我们生成的sql代码,代码如下
EF在生成sql语句的时候,因为包装类中,属性Name的标识为 修改状态,则在生成sql语句的时候,Name就被插入到表中
exec sp_executesql N'UPDATE [dbo].[Student]
SET [Name] = @0
WHERE ([Id] = @1)
',N'@0 nvarchar(50),@1 int',@0=N'kim',@1=2
【注】
如果实体属性中有属性非Numable会报异常,可以取消验证

删,代码如下:
private static void Delete()
{
//1.查出要删除的对象
Student stu = dbContext.Students.Where(s => s.Id == 3).FirstOrDefault();
//2.将实体附加到EF上下文中,EF会为该对象生成包装类对象,并标识各属性为“unchanged”
DbEntityEntry<Student> entry = dbContext.Entry<Student>(stu);
//3.给该包装类对象 添加一个标识 Deleted
entry.State = EntityState.Deleted;
//4.EF在生成sql语句的时候,发送标识是 删除 ,则生成删除的sql语句
dbContext.SaveChanges();
}
用Sql server profiler监视EF为我们生成的sql代码,代码如下
exec sp_executesql N'DELETE [dbo].[Student]
WHERE ([Id] = @0)',N'@0 int',@0=3
5.讲了这么多竟然还没讲orm是什么东西
| orm 即 Object Relational Mapping 中文翻译即 对象 关系 映射, 对象:可以理解为C#中的定义的类; 关系:可以理解为关系型数据库,我们用的MSSQLSERVER就是其中一种 映射:更好理解了,就是 对象 与 数据库中表 的一一对应关系 EF就是ORM中的一种,学好了EF,学习其他 ORM也是一样的 |
| 扩展:ORM框架的核心是实现了跨数据库,因为对于不同的数据库,只要改下配置文件中的数据库引用值即可。如果是sql的话就用sql ado.net。如果是oracle的话就用oracle ado.net EF的强大之处,就是在微软开源它之后,它将可以在Linux上直接运行 |
MVC系列学习(二)-初步了解ORM框架-EF的更多相关文章
- ASP.NET MVC学习---(一)ORM框架,EF实体数据模型简介
现如今 对象关系映射(ORM)框架 被大量的使用于企业级应用的开发 为什么要使用ORM? ADO.NET操作数据库不好吗? 我们可以仔细想想 当我们使用ADO.NET操作数据库的时候 我们需要先获取连 ...
- ORM框架EF
应用程序和数据库采用Tcp协议通讯 ORM框架有: NHibernate ,Dapper ,Mybatis 底层是 ADO.Net 好处: 1.面向对象 2.没有sql减少学习成本,快速开发 3.编译 ...
- python(十二)下:ORM框架SQLAlchemy使用学习
此出处:http://blog.csdn.net/fgf00/article/details/52949973 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 ...
- ORM框架 EF - code first 的封装 优化一
上一节我们讲到对EF(EntityFramework)的初步封装,任何事情都不可能一蹴而就,通过大量的实际项目的实战,也发现了其中的各种问题.在这一章中,我们对上一章的EF_Helper_DG进行优化 ...
- MVC系列学习(四)-初识Asp.NetMVC框架
注:本文章从伯乐那盗了两张图,和一些文字: 1.MVC设计模式 与 Asp.Net Mvc框架 a.MVC设计模式 MVC设计模式 是一种 软件设计模式,将业务逻辑 与 界面显示 分离,并通过某种方式 ...
- ORM框架 EF - code first 的封装
Code first 是Microsoft Entity Framework中的一种模式,CodeFirst不会有可视化的界面来进行拖动编辑DataBase-Entity,但会以一个类来进行对数据表关 ...
- ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...
- 【EF 4】ORM框架及其流行产品之一EF介绍
导读:跳进了多租户切换数据库的坑,那么就继续走下去吧.在我们的项目中,是运用EF实现对数据库的操作,那么EF其实是.NET系统中,基于ORM框架的一个产品实现.在java那边,则有Hibernate和 ...
- EF 太重,MyBatis 太轻,ORM 框架到底怎么选 ?
以 EF 为代表的基于 Linq 的 ORM 框架总是 很重. 他们的功能早已超出了一个 ORM 的范畴, ORM 是 Object Relational Mapping ,从名字上看,其初衷是将 数 ...
随机推荐
- 3.8.5 多重选择:switch语句
在处理多个选项时,使用if/else结构显得有些笨拙. Scanner in = new Scanner(System.in); Syste ...
- idea 如何将本地代码上传到github
1. 首先切换到项目根目录下 执行 git init 2. 点击项目右键->Git->Repository->Remotes->编辑URL 到github代码地址.
- shrink&split
shrink将分片数按因子缩减.hard link segment文件.因缩减前后hash一致,不需要rehash.如:0 ,1 , 2, 3, 4, 5, 6, 7, 8.9个分片缩减成3个:0 [ ...
- 【Codeforces 682C】Alyona and the Tree
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 设dis[v]表示v以上的点到达这个点的最大权值(肯定是它的祖先中的某个点到这个点) 类似于最大连续累加和 当往下走(x,y)这条边的时候,设 ...
- 19、Java并发性和多线程-嵌套管程锁死
以下内容转自http://ifeve.com/nested-monitor-lockout/: 嵌套管程锁死类似于死锁, 下面是一个嵌套管程锁死的场景: 线程1获得A对象的锁. 线程1获得对象B的锁( ...
- angularjs中比较实用的multipleselect选择框
一. HTML HTML中比较多逻辑代码,修改的时候要注意修改很多绑值的地方. <div class="form-group"> <label class=&qu ...
- laravel5.5更新到laravel5.7
为什么要更新呢?因为项目用的第三方后台扩展包,有很些bug,不够完美.想要一个漂亮的后台,那个后台只支持5.7. 然后,我就开始更新框架了. 修改后:"php": "&g ...
- golang中select case 的用途到底是啥
https://nanxiao.gitbooks.io/golang-101-hacks/content/posts/select-operation.html ------------------- ...
- 关于NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary
NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary 在 OC 中我们天天都要用,而我们要怎 ...
- 微信公众号H5用户授权
其实不是很难,总结起来就是: 1.微信公众号管理后台设置redirect_uri. 2.然后发起一个请求去重定向获取code,然后把获取到code之后重定向的URL放在获取code的URL中 3.获取 ...