EF的简单认识

EF简介

EntityFramwork是微软提供的一款ORM框架(Object Relational Mapping),实体映射模型,它的底层是ADO.NET的机制,使用EF将省去了我们对数据访问层的代码的编写,省去了对于SQLHelper等对数据库的操作逻辑,可以让我们把更多的时间放在上层方面的实现上。只要是操作数据的项目都可以使用EF简化对数据层的维护,类似的ORM框架还有很多比较轻量级的框架,此处没有研究。

EF的安装和使用问题

可以使用从微软的工具Nuget上直接获取,在EF的使用使用过程中,可能会遇到一些错误,本人在学习的时候就遇到了一些问题。

1.遇到创建EF数据模型文件的时候,发现没有ADO.NET实体数据模型的模板

解决方法:

在C:\ProgramData\Package Cache\下面搜索到EFTools.msi

vs2012对应的是EFTools V11

vs2013 对应的是EFTools V12

2.在使用EF6的时候,遇到编译错误

正在在编译转换:未能找到元数据文件“”%VS120COMNTOOLS..\IDE\EntityFramework.dll%

解决方案:

这类问题就是设置系统的环境变量VS120COMNTOOLS的设置的路径是不正确的,所以需要制定一个正确的路径,这个路径下一定要包含IDE文件夹,在IDE文件加下,一定要包含着相应的dll文件

我的电脑-右击属性-高级系统设置-高级-环境变量-选择系统变量中找到这个变量

我的正确设置的路径是E:\VS2013和Sql安装文件\VS2013Install\Common7,这个文件路径就是我的VS的安装目录没在这个目录的下一级就是IDE,里面已经包含着相应的Dll文件

EF的开发模式

DataBaseFirst

下面将使用空的Web演示操作步骤:

1.首先创建一个空的web应用程序

2.安装好以后,点击添加 数据-ADO.NET 实体模型,文件的后缀名字是model1.edmx,此时弹出来选择的类型:从数据库中生成:就是所谓的DataBaseFirst

空模型:ModelFirst

3.然后新建连接选择对应的数据库和表(对于敏感数据那一项直接打钩)

4.完成后会有几个文件添加进来

Model1.tt:T4模板,这个是代码生成工具,就是用来生成实体模型类,微软的代码生成工具的后缀名都是.tt

Model.edmx.diagram:这是和实体模型设计器相对应,用来描述模型的。

。。。

此时所有的需选择出的数据库中的表都已经在项目中生成相应的model,同时为我们生成一个数据操作类继承自DbContext

代码语法操作

添加数据

Useruser=newUser();

            user.UserName="zhaohongjian";

            user.Password="123";

            AddressListEntitiesdb=newAddressListEntities();//上下文对象,连接数据库和实体类

            db.User.Add(user);

            //db.User相当于一个内存数据

db.SaveChanges();//存取到数据库中

            Response.Write(User.ID);//系统中默认的返回的是刚刚插入的数据的主键的ID,也就是说,可以获取到一些数据库中的信息,因为已经SaveChanges()了

 

AddressListEntities这个类是继承自DbContext类,当对象实例化的时候,会调用父类的构造函数,将连接字符串传入进去。在AddressListEntitie这个类中存在着

publicDbSet<User>User { get; set; },这个和数据库中的表示相连接的,也就是不改动的话,他们存放的数据是一样

          注意:

Db.User.Add(user1);

Db.User.Add(user2);

Db.SaveChanged();

多次数据库的操作,但是EF只用操作一次就全部执行了,这是集成了工作组模式,大大减少了对于数据操作的频率,提高性能。同时SaveChange()方法内部实现了事务模式,出现失误会进行回滚操作

 

查询:

EF中的查询采用的是延迟加载的机制,也就是当使用的时候才会进行查询操作

EF中的查询是支持Linq的

      protectedvoidButton2_Click(object sender, EventArgs e)

        {

            AddressListEntitiesentity=newAddressListEntities();

            IQueryable<User>resultList=from cell in entity.User

                                          where cell.UserName=="zhaohongjian"

                                          select cell;//因为相当于连通器,所以可以直接操作内存中的模拟数据表,但是此时并没有用到相应的数据,所以此时并没有查询数据库

            Response.Write(resultList.FirstOrDefault<User>().Password);//此时才会去查询数据库

        }

 

删除:

           1.先进行查询出想要删除的数据,然后使用删的API,无法直接构建一个user实例,直接删除,因为自己直接构建的user类实例,没有实现模拟表与数据库中表的映射。

//先查询

            AddressListEntitiesentity=newAddressListEntities();

            IQueryable<User>resultList=fromcellinentity.User

                                          wherecell.UserName=="zhaohongjian"

                                          selectcell;

           //再删除

            entity.User.Remove(resultList.FirstOrDefault());//这些操作只是在操作的内存中的模拟表

          entity.SaveChanges();

           2.使用自己定义的类的实例,然后手动绑定(Entry

           Useruser=newUser() { UserName="zhaohongjian" };

            AddressListEntitiesdbContext=newAddressListEntities();

            dbContext.Entry<User>(user).State=System.Data.EntityState.Deleted;//手动的打上标记,在内存的模拟表中删除,同时实现与数据库的映射,将user

            dbContext.SaveChanges();

 

 

更新:

对于更新是没有对应的直接修改模拟表的Update方法,所以可以使用添加标记并删除模拟表的方式进行修改

具体的使用方式也是有两种,和删除的时候是类似的

  1. 先查询后更新(使用打标记更新)
  2. 自己构造然后打标记

AddressListEntitiesdbContext=newAddressListEntities();

            Useruser=newUser() { UserName="zhaohongjian", Password="ddd" };

            dbContext.Entry<User>(user).State=EntityState.Modified;

            dbContext.SaveChanges();

ModelFirst

modelFirst的操作就是在创建ADO.NET实体数据模型的时候,选择的模板是空模板,此时将会直接载入Model1.tt,Model.edmx.diagram,然后直接在实体操作界面直接进行创建就好了,右击添加实体模型,然后可以使用右击-添加标量属性,添加普通的属性,同时可以使用F4直接调出属性界面,在里面对属性进行相应的设置,右击-添加导航属性,可以构建两个实体之间的关系,实现一对多等关系的映射,导航属性,可以使得模型之间可以相互调用。

当模型创建完毕之后,然后保存一下,应该就会生成相应的model文件(没显示出来也是没有关系的),然后右击-根据模型更新数据库,然后会生成相应的DDL文件

 

点击完成之后会产生xxx.sql文件,你可以直接在VS中执行这个文件,然后会在数据库生成相应的数据表,当然你可以将sql文件中的省sql语句考到sqlserver中去执行即可

具体的配置已经完毕,关于代码的使用,跟DataBaseFirst使用是一样的

注意事项:关于模型的修改,当重新添加一格model的时候,你需要再次操作根据模型生成数据,生成的sql文件一定不要着急的去执行,首先需要将前面的Drop语句删掉,因为EF会将你以前的表全部删除,然后全部重新生成,所有如果不删除的话,以前的数据将会丢失。对于某一个model中的属性的修改,直接在数据库中将表改一下,就可以了,没有必要操作“根据模型生成数据库”。

CodeFirst

其实就是我们用自己搭建代码的形式,将VS创建的过程完全的模拟出来,代码基本上都是按照VS自动生成的仿照。

创建相相应的codeFirst之前,添加相应的类库

System.ComponentModel.DataAnnotations.dll(这个类库是系统的,用来标记特性)

EntityFramework.dll(添加的EF的package中)

System.Data.Entity.dll(系统)

1.创建相应的实体类,并对实体类添加相应的特性

public  classClass

    {

      [Key]

      publicintId { get; set; }

      [Required]

      [StringLength(32)]

      publicstringClassName { get; set; }

      publicvirtualICollection<Student>StudentInfo { get; set; }

    }

public   classStudent

    {

       [Key]

        publicintStudentId { get; set; }

        [Required]

        [StringLength(32)]

        publicstringStudentName { get; set; }

        publicvirtualClassClassInfo { get; set; }

    }

2.配置config文件,主要是将数据库连接字符串添加到配置文件中

<connectionStrings >

<add name="connStr" connectionString="server=.;database=mm;uid=****;pwd=****" providerName="System.Data.SqlClient" />

</connectionStrings>

3.编写我们自己的数据访问上下文类,这个类必须继承自DbContext

public   classMyDbContext:DbContext

    {

        publicMyDbContext()

            : base("name=connStr")

        { }

        protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder)

        {

          //这句代码的作用就是去除生成的数据中的表格是复数的形式,保持原来的命名         

           modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

        }

        publicDbSet<Class>Class { get; set; }

        publicDbSet<Student>Student { get; set; }

}

4.就可以直接使用了

classProgram

    {

        staticvoidMain(string[] args)

        {

            MyDbContextdbContext=newMyDbContext();

            Classclass1=newClass { ClassName="赵家班" };

            dbContext.Database.CreateIfNotExists();

            dbContext.Class.Add(class1);

            dbContext.SaveChanges ();

        }

    }

备注:以上只是自己对EF学习的一点记录,如有错误,欢迎批评指正

 

时间: 2024-08-01 18:03:00

EF的简单认识的相关文章

Asp.net Core 2.1使用 EF Core 简单增删改查操作数据库

Asp.net Core 2.1使用 EF Core 简单增删改查操作数据库 大概步骤如下5步: 1.创建项目(Asp.net Core 2.1项目) 2.项目使用EF Core 3.建立实体 4.生成迁移文件(生成数据库) 5.使用VS工具生成视图.控制器代码 示例代码下载  https://github.com/ZhMartincheng/NetCoreDemo.git 1.创建项目(Asp.net Core 2.1项目) 选择.net core 版本2.1 基础项目创建成功 2.项目使用E

.Net框架搭建之1、SQL Server EF MVC简单三层框架

.Net简单三层框架简介 简单三层框架,是.Net开发中最最基础的框架了,由 数据访问层.逻辑处理层.表示层组成.一般情况下,在项目中数据模型Model层也是单独一层,但是只是单纯的数据模型不算在业务层划分当中. 好了,框架搭建,如果不了解,可能会觉得难以下手,了解之后,自然知道怎么做,只是其中的步骤,比起单纯的功能开发,是要繁琐不少,下面我们来一步一步搭建属于自己的框架,这里只列出重要步骤,其他未提到的细节可自行摸索. 数据模型Model层创建 数据模型层,首先要创建数据库,再从数据库生成EF

使用EF 的简单的增删改查

using DAL; using Model; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BLL { public class InfoManage { private BaseDal db; public InfoManage(BaseDal dal) { this.db = dal;

MongoDB 系列(一) C# 类似EF语法简单封装

之前写过一篇关于MongoDB的封装 发现太过繁琐 于是打算从新写一篇简易版 1:关于MongoDB的安装请自行百度,进行权限认证的时候有一个小坑,3.0之后授权认证方式默认的SCRAM-SHA-1模式, 需要首先命令创建一个用户,然后Drop掉这个用户,然后修改system.version里的authScheam为3,在没有创建用户的情况下 authScheam的值貌似是查询不到的. 修改成3后,授权验证方式就变成了MONGODB-CR  2:建立一个聚合根和实体 public interfa

mvc+EF实现简单的登陆功能

EF采用DatabaseFirst的方式处理数据     新建一个LoginController [HttpGet] public ActionResult Login() { var UserName = Request.Cookies["UserName"] == null ? "" : Request.Cookies["UserName"].Value; ViewBag.UserName = UserName; return View();

.net core EF的简单使用

1.在mysql中新建一个表 2.在控制台中装个EF包  Install-Package Pomelo.EntityFrameworkCore.MySql 3.新建一个Person类 4.创建DbContext 5.执行添加语句

EF实现简单的增删改查

1.在项目中添加ADO.NET实体数据模型: 2.接着根据提示配置数据库连接,配置完毕之后项目中生成了大致如下的内容(EF6.x): 其中TestData.tt中的Consumer,Stores是创建时选的数据库中的表 3.在TestDataContext.cs中可以看到生成的实体框架的名字: 4.开始实现增删改查的功能(我是在控制台程序中实现的): 1.实例化该实体框架(我不知道这样叫对不对) EFTestEntities testEntities = new EFTestEntities()

EF入门

一,对比Linq to SQL 最近学了两个具有ORM思想的东西,一个是Linq to SQL ,另一个是EF... 学完之后总是从使用上感觉它们是一样的,后来自己查了查,统计了个表格: 各有优劣吧~~欢迎前来补充~~~~ 二,EF实现简单增删改查 static void Main(string[] args) { #region 增加单个实体 using (var dbContext = new SecondChargeEntities())//先创建访问数据库的入口 { var mystud

Entity Framework的简单使用

公司的项目在用EF,最近抽时间研究了下,整理了一个比较公用的EF框架,供大家一起分享下. EF这东东,用得好的话,确实方便了开发:用得不好的话,出了问题半天也找不出是什么原因. 现在就先介绍EF的简单使用.主要分为以下5个项目 EF.Core:数据实体 EF.Data:C#实体跟数据表直接的映射 EF.Service:数据服务 EFFramework:公共类库 EFSolution:测试项目 DbContext是EF比较重要的类,我们的数据库访问对象都必须继承该类.下面就是我们要用到的数据上下文