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()后,编译器报一个实体或多个实体验证失败!这个错误的时候,大多数情况下,是我们添加的字段的数据长度超过我们数据库定义的字段的长度,或者是我们添加的字段的数据类型和数据库的字段类型不一样导致。