• MVC系列学习(二)-初步了解ORM框架-EF


    1.新建 一个控制台项目

    2.添加一个数据项

    image

    a.选择数据库

    注:数据库中的表如下:

    image

    image

    b.选择EF版本

    image

    c.选择表

    image

    3.初步了解EF框架

    看到了多了一个以 edmx后缀的文件

    image

    在edmx文件上,右击打开方式,选择 XML(文本)编辑器 打开

    该xml主要包含三部分:(数据库存储模型,实体模型,关系映射)

    edmx还为我们生成了两个tt模板

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

    image

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

    image

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

    image

    接下来,看看这两个tt模板

    a.首先看上下文模板(StudentModel.Context.tt)

    image

    通过读取edmx的中的配置信息,生成了EF上下文对象,即StudentModel.Context.cs

    【可以理解为,提供给程序员操作数据库的一个接口】

    b.实体tt模板

    image

    读取edmx中的配置,生成各实体,最终生成实体类,即Student.cs

    4.了解了EF中的映射关系,接下来用代码再解释一下

    首先看一张图,了解EF在我们实际操作中的具体位置,发现在数据库与实体对象之间

    image

    下面就用上图的解释,来写增删改查

    增,代码如下:

    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会报异常,可以取消验证

    image

    删,代码如下:

    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上直接运行
    更多精彩内容请看:http://www.cnblogs.com/2star
  • 相关阅读:
    交通部道路运输车辆卫星定位系统部标JTT808、809、796标准大全
    linux下如何源码编译安装vim
    Ubuntu如何重新启动tftp服务
    Ubuntu如何自定义tftp服务根目录
    git如何撤销git add操作?
    如何使两台主机间的不同网段互通?
    debian下如何源码安装tmux
    mysql插入数据自动生成主键uuid
    mysql的 UUID的生成方式
    MySQL SQL语句 生成32位 UUID
  • 原文地址:https://www.cnblogs.com/kimisme/p/4445440.html
Copyright © 2020-2023  润新知