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:指定了映射的两个模型SchoolModelStoreContainerSchoolEntities
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 NINSERT [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的所有的学生
    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 NUPDATE [dbo].[Student]
SET [Name] = @0
WHERE ([Id] = @1)
,N@0 nvarchar(50),@1 int,@0=Nkim,@1=2

删,代码如下:

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 NDELETE [dbo].[Student] 
WHERE ([Id] = @0),N@0 int,@0=3

5.讲了这么多竟然还没讲orm是什么东西

orm 即 Object Relational Mapping
中文翻译即 对象 关系 映射,
对象:可以理解为C#中的定义的类;
关系:可以理解为关系型数据库,我们用的MSSQLSERVER就是其中一种
映射:更好理解了,就是 对象 与 数据库中表 的一一对应关系
EF就是ORM中的一种,学好了EF,学习其他 ORM也是一样的

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。