EF简介

EF:EF是 asp.net的一套ORM框架.

ORM:

广义上:ORM指的是面向对象的模型和关系型数据库的数据库之间的相互转换;

狭义上:ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据接口。

Dbcontext:这个类就是实现关系型数据库和面线对象交互的数据接口。

一、当添加完EF实体之后:

1、系统会自动生成一个(对应ef模块名.content.tt文件),  这个模版是帮助我们生成ef访问上下文的,里面有一个数据库实体,上面这个例子是TestEntities实体,不管你添加什么样的数据库实体,都会自动继承Dbcontext这个类,所以Dbcontext:这个类就是实现关系型数据库和面线对象交互的通用数据接口。

2、系统还会生成一个(对应ef模块名.tt文件),这个模版是帮助我们生成一个数据库对应的表实体.

3、另外需要注意一点,系统还会生成一个(对应ef模块名.Designer.cs文件)这个文件在ef4.0之后里面是没有代码的,但是在ef4.0的时候是有的,那个时候里面存放的是数据库上下文和数据库对应的表实体,如果你需要使这个(对应ef模块名.Designer.cs文件)文件里面的文件重现,你只需要找到对应的数据库模型,右键模型,点击属性-代码生成策略-改为默认值,就可以了,但是这会与(对应ef模块名.tt文件)文件里面的模型产生冲突.

4、系统会自动添加EntityFramework和System.Data.Entity两个引用.

二、使用ef进行数据库的增删改差:

ef实现增删改差的流程:(1)通过把实体的变化,转换成数据处理类(语句) (2)通过调用ADO.NET将处理类(语句)转换成sql语句(3)将sql语句插入到数据库中执行并返回结果(4)ADO.NET将数据库结果返回给程序

通俗点说,就是ef帮助我们把实体的变化翻译成sql语句,然后调用底层的ADO.NET保存到数据库中去。

1、当使用上下文操作数据库表时,被操作表必须含有主键,否则回报错。

2、

  //利用EF像数据库中添加一条数据

            //first step:创建访问数据库的统一入口.创建EF的上下文
            TestEntities dbContext = new TestEntities();

            #region 添加一条数据
            //second step:操作实体
            T_ConsultingList list = new T_ConsultingList();
            list.Content = "EF测试";

            //third step:告诉上下文执行添加操作;
            dbContext.T_ConsultingList.Add(list);
            //dbContext.Entry(list).State = EntityState.Added;  也可以这样写

            //forth step:告诉上下文,执行保存操作
            dbContext.SaveChanges(); 
            #endregion

            list.AutoId = 1; //修改或删除必须要有主键

            list.Content = DateTime.Now.Day.ToString();//操作实体对应的属性 

            dbContext.Entry(list).State = EntityState.Modified; //将当前实体标记为修改

            dbContext.SaveChanges();//告诉上下文把所有标记了的实体映射回数据库,也就是把所有标记为modified都生成update语句到数据库里面去执行

注意上面这段代码,上面的添加操作能正常完成,但是下面的修改会报错,错误如下:

属性“AutoId”是对象的键信息的一部分,不能修改。

错误的原因我们来分析下:

经过调试代码我们发现,当我们第一次new T_ConsultingList对象时,这个对象为空,当我们使用ef添加完数据后,再去观察这个对象我们会发现,这个对象里面已经有值了,而里面的值就是我们刚才所添加的值,说明在我们执行完数据库添加操作之后,数据库里面的数据马上将我们所添加的数据马上映射给了当前的实体对象,所以当我们在下面指定需要修改的记录的主键时,如果修改和添加共用同一个对象,那么我们只能修改刚刚添加的那条记录,而不能修改其他的记录,如果要修改,必须像下面这样:重新在new 一个T_ConsultingList对象,那么原先数据库映射回来的数据会被覆盖掉;理解这一点跟重要!

         //利用EF像数据库中添加一条数据

            //first step:创建访问数据库的统一入口.创建EF的上下文
            TestEntities dbContext = new TestEntities();

            #region 添加一条数据
            //second step:操作实体
            T_ConsultingList list = new T_ConsultingList();
            list.Content = "EF测试";

            //third step:告诉上下文执行添加操作;
            dbContext.T_ConsultingList.Add(list);
            //dbContext.Entry(list).State = EntityState.Added;  也可以这样写

            //forth step:告诉上下文,执行保存操作
            dbContext.SaveChanges(); 
            #endregion

            T_ConsultingList list1 = new T_ConsultingList();
            list1.AutoId = 1; //修改或删除必须要有主键

            list1.Content = DateTime.Now.Day.ToString();//操作实体对应的属性 

            dbContext.Entry(list1).State = EntityState.Modified; //将当前实体标记为修改

            dbContext.SaveChanges();//告诉上下文把所有标记了的实体映射回数据库,也就是把所有标记为modified都生成update语句到数据库里面去执行

这段代码相比上面多了一行代码:  T_ConsultingList list1 = new T_ConsultingList(); list1相当于一个新对象,你可以利用这个对象,来指定你要修改(或删除)的对应记录的id和修改的内容。而不是用数据库映射回来的那条数据,如果你用映射回来的那条数据,但是你打算修改的那条数据的主键id却不是映射回来的那条数据的主键id,那么就会认为你要修改映射回来的那条数据的主键id,而主键是不允许修改的,所以就会报错!

3、当我们在操作完数据库对应的表示表实体后,执行dbContext.SaveChanges()后,编译器报一个实体或多个实体验证失败!这个错误的时候,大多数情况下,是我们添加的字段的数据长度超过我们数据库定义的字段的长度,或者是我们添加的字段的数据类型和数据库的字段类型不一样导致。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

Android热插拔事件处理详解

一、Android热插拔事件处理流程图 Android热插拔事件处理流程如下图所示: ? 二、组成 1. NetlinkManager:       ...

85670
来自专栏Java3y

Hibernate面试题大全

Hibernate常见面试题 Hibernate工作原理及为什么要用? Hibernate工作原理及为什么要用? 读取并解析配置文件 读取并解析映射信息,创建...

45050
来自专栏武军超python专栏

2018年8月5日对之前学习python中的问题总结

问题: linux中whereis和which的区别: whereis python     which python whereis是一个文件查找命令,...

10650
来自专栏Golang语言社区

goroutine背后的系统知识

Go语言从诞生到普及已经三年了,先行者大都是Web开发的背景,也有了一些普及型的书籍,可系统开发背景的人在学习这些书籍的时候,总有语焉不详的感觉,网上也有若干...

35480
来自专栏智能算法

Python学习(九)---- python中的线程

原文地址: https://blog.csdn.net/fgf00/article/details/52773459 编辑:智能算法,欢迎关注! 上期我们一起学...

17620
来自专栏代码世界

Python之进程

进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机...

68670
来自专栏Elasticsearch实验室

Elasticsearch 底层系列之分片恢复解析

我们是基础架构部,腾讯云 CES/CTSDB 产品后台服务的支持团队,我们拥有专业的ES开发运维能力,为大家提供稳定、高性能的服务,欢迎有需求的童鞋接入...

78850
来自专栏后台全栈之路

基于汇编的 C/C++ 协程 - 实现

将 libco 和 libevent 两者的功能糅合起来,所以我把我的工程,命名为 libcoevent,意为 “基于 libevent 的同步协程服务器编程框...

60430
来自专栏JackeyGao的博客

Celery用户手册 - Tasks

Tasks是Celery 应用的构建块。事实上Celery应用是由一个或多个Task拼装组成的。

21530
来自专栏蓝天

Linux下共享库(SO)有关的几个环境变量

Linux支持共享库已经有悠久的历史了,不再是什么新概念了。大家都知道如何编译、连接以及动态加载(dlopen/dlsym/dlclose) 共享库。但是,...

17110

扫码关注云+社区

领取腾讯云代金券