方法1:

  新建好项目之后 → 右击类库 → 新建项 → ADO.NET实体数据模型(在Visual C#项中) → 从数据库生成 → 选择你要映射的数据库的数据源(将 『是,在连接字符串中包含敏感数据』勾上) → 选中要映射的表、视图、存储过程。

下面是使用!

//保证一次请求共用一个上下文实例

var dbContext = DbContextHelper.getCurrentDbContext();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Web; namespace myWeb
{
public class DbContextHelper
{ //保证一次请求共用一个上下文实例
public static MyDbContext getCurrentDbContext()
{
#region HttpContext方式:内部封装了CallContext,所以HttpContext方式和CallContext方式差别不大
// //HttpCntext:一次请求,HttpContext已经保证只有一个实例
// MyDbContext dbContext = HttpContext.Current.Items["MyDbContext"] as MyDbContext;
// if (dbContext == null)
// { //当前Http上下文不存在当前对象
// dbContext = new MyDbContext();
// HttpContext.Current.Items.Add("MyDbContext", dbContext);
// }
#endregion #region CallContext方式
MyDbContext dbContext = CallContext.GetData("DbContext") as MyDbContext;
if (dbContext == null)
{
dbContext = new MyDbContext();
CallContext.SetData("DbContext", dbContext);
} #endregion return dbContext;
} }
/// <summary>
/// 这里的MyDbCotext类只是打一个比方,实际在用的时候需要更改成项目所需要用的实体类
/// </summary>
public class MyDbContext
{ }
}

DbContextHelper.cs

//1、声明一个EF的上下文
MyTestEntities1 dbcontext = new MyTestEntities1();
//dbcontext.Database.Connection.ConnectionString = "";//重新设置数据库连接字符串(对于非常重要数据库,如银行的账号密码等,需要对数据库字符串进行密钥加密的,可以在这里解密后重新赋值)
 //2、声明一个User实体
//USERS user = new USERS();
//user.NAME = "vichin";
//user.SEX = "男";
//user.DATE = "19921126";
//user.ID = 4;
//user.NUMBER = 4; //3、告诉EF,咱们对实体的做一个插入操作
//dbcontext.USERS.Add(user); //3、告诉EF,咱们对实体的做一个删除操作
//dbcontext.USERS.Remove(user);

做一个 添加/删除 操作

            //2、声明一个实体
USERS user = new USERS();
user.SEX = "男";
user.NAME = "vichin";
user.DATE = "";
user.ID = ; //3、告诉上下文咱们要对此实体进行更新操作 #region 对一整行数据进行更行
dbcontext.Entry<USERS>(user).State = System.Data.Entity.EntityState.Modified;//要做删除的话,只需要将modified改写成Deleted #endregion #region 对一行数据中,某个字段进行更新
dbcontext.USERS.Attach(user);//将新的user对象附加到上下文中来,进行管理
dbcontext.Entry<USERS>(user).Property<string>(u => u.NAME).IsModified = true; // EF5.0之后的写法(VS2012开始使用)
dbcontext.Entry<USERS>(user).Property("NAME").IsModified = true;//EF4.0的写法(VS2010中的写法)
#endregion

做一个更改操作

//4、告诉上下文把实体的变化保存到数据库(执行SQL脚本)
dbcontext.SaveChanges();
       //使用查询语法
var temp = from u in dbcontext.USERS
where u.ID ==
select u;
  
        //查询部分列
        var data = from u in dbcontext.USERS
        select new { u.ID, u.NAME, u.SEX, u.NUMBER };         //使用方法语法
        var temp2 = dbcontext.USERS.Where(u => u.ID == );                //查询部分列
        var data1 = dbcontext.USERS.Where(u => u.ID == ).Select(u=>u.ID);
        var data2 = dbcontext.USERS.Where(u => u.ID == ).Select(u => new { u.ID,u.NAME,u.NUMBER});      //IQueryable<USERS> temp1 = from u in dbcontext.USERS
// where u.ID == 4
// select u;      //上面是在数据库中做了筛选之后才放到内存中的      //linq to object 将数据库的数据全都放到内存中
     //var temp1 = from u in dbcontext.USERS.ToList()
            //where u.ID == 4 
            //select u; #region 分页 var pageData = dbcontext.USERS.Where(u => u.ID > ).OrderBy<USERS, int>(u => u.ID);
//int <==> ID 根据ID来排序,所以在OrderBy后面的泛型约束中TKey 使用int(因为ID是int类型的)
var pageData1 = dbcontext.USERS.Where(u => u.ID > ).OrderBy<USERS, string>(u => u.NAME); //在实际使用中,可以将orderBy后面的泛型约束给省略掉:
var pageData2 = dbcontext.USERS
.Where(u => u.ID > .)
.OrderBy(u => u.NAME)
// 每页5条,要取第三页的数据。从第10条数据开始取5条数据
.Skip(*(-))//越过多少条数据呢? 越过前2页的数据
.Take();//取5条 //使用查询语法做分页
var pageData3 = (from u in dbcontext.USERS
where u.ID >
orderby u.ID descending
select u).Skip().Take();
//还是要用到skip take #endregion

做一个查询

 在对数据库进行删除、更新操作时,一定要将所有的非空字段(实体的属性)赋值,即使在更新的时候用不到那个字段,也得赋值。


方法二:

1、在VS中创建数据库

  点击 view(视图)→sql server对象资源管理器(或者叫数据库资源管理器database Explorer)→在SQL 对象资源管理器中右击Sql Server→添加Sql server.之后再创建的Sql server对象中添加database 和 表(此处以Products为例),并在表中添加一些测试数据。

2、创建数据模型

  数据模型类名为Product

3、添加EF 并创建EF上下文

  install-package entity framework -version5.0

  namespace SportsStore.Models.Repository{

    public class EFDbContext:DbContext{

      public DbSet<Product> Products{get;set;}// Products与表名Products相同,表中每一行数据都用Product来表示

    }  

  }

  在web.config文件中ConfigSections节点后添加数据库连接字符串

  <connectionStrings>
<add connectionString="Data Source=RY4H4GAGMN6Y5LN;Initial Catalog=SportsStore;Integrated Security=True" name="EFDbContext" providerName="System.Data.SqlClient"/>
</connectionStrings>

添加的节点

4、在仓储层中创建一个存储库类,它将对前面创建的EFDbContext类执行操作,并作为应用程序业务逻辑与数据库之间的“桥梁”。

  namespace SportsStore.Models.Repository{

    public class Repository{

      EFDbContext context=new EFDbContext ();

      public IEnumber<Product> Products{get{return context.Products;}}

    }

  }

5、使用(只要创建仓储层对象就可以使用了)

  Repository repo=new Repository();

  repo.Products


当数据库内的表或者字段发生变化时,就会报以下错误:

The model backing the 'EFDbContext' context has changed since the database was created. Consider ....

最直接的方式是删除VS中的数据库,并且重新添加。

linqpad官网: http://www.linqpad.net/  

下面是常见错误(部分)


报错: Unable to update the EntitySet 'USERS' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation.

报错:从 ObjectStateEntry 中检索值时出错。有关详细信息,请参阅内部异常。

原因:报这个错的原因是表中没有主键!

————————————————————————————————————————————
代码:dbcontext.Entry<USERS>(user).State = System.Data.EntityState.Modified;

报错:无法将类型"System.Data.EntityState"隐式转换为"System.Data.Entity.EntityState"

原因:这行代码是EF5.0中的写法,如果用的是6.0则需要写成
dbcontext.Entry<USERS>(user).State = System.Data.Entity.EntityState.Modified;

————————————————————————————————————————————
报错:对一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。

原因:实体的非空属性没有全部都被赋值,或者是数据的长度超过了定义的类型 (NVARCHAR 100)

————————————————————————————————————————————
报错:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager项

原因:要操作的数据在数据库并不存在。(例如:要删除一个ID为9999的数据,可是当前数据库中并没有ID为9999的数据)

—————————————————————————————————————————————————————————————————————————EF优缺点

  优点:

  1、极大提高开发效率,与VS的开发工具集成度高,开发中没,代码几乎都是强类型的,写代码效率高,自动化程度高,命令式编程。

  2、EF提供的模型设计器非常强大,不仅仅带来了设计数据库的革命,也带来了自动化生成模型代码的功能,极大提高了开发与架构设计的效率。

  3、仅仅通过改变配置,就可以做到夸数据库的能力。

缺点:

  性能差(在生成SQL脚本阶段),在复杂查询的时候,生成的SQL脚本效率不高。

   1、根据XML映射关系及实体的状态生成相应的脚本(相对于SQL语句在数据库中执行的速度来说是慢的,所以在做互联网项目的时候不推荐使用EF,而在做企业级开发的时候,可以使用。)

  2、不在数据端额外的消耗性能

如何使用EF?的更多相关文章

  1. %E3%80%90%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E3%80%91

    "%3Cdiv%20class%3D%22htmledit_views%22%20id%3D%22content_views%22%3E%0A%20%20%20%20%20%20%20%20 ...

  2. 你必须知道的EF知识和经验

    注意:以下内容如果没有特别申明,默认使用的EF6.0版本,code first模式. 推荐MiniProfiler插件 工欲善其事,必先利其器. 我们使用EF和在很大程度提高了开发速度,不过随之带来的 ...

  3. 采用MiniProfiler监控EF与.NET MVC项目(Entity Framework 延伸系列1)

    前言 Entity Framework 延伸系列目录 今天来说说EF与MVC项目的性能检测和监控 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC Mi ...

  4. 采用EntityFramework.Extended 对EF进行扩展(Entity Framework 延伸系列2)

    前言 Entity Framework 延伸系列目录 今天我们来讲讲EntityFramework.Extended 首先科普一下这个EntityFramework.Extended是什么,如下: 这 ...

  5. EntityFramework之DetectChanges's Secrets(三)(我为EF正名)

    前言 对于应用程序开发者来说,通常不需要考虑太多对于Entity Framework中的变更追踪(change tracking),但是变更追踪和DetectChanges方法是栈的一部分,在这其中, ...

  6. ASP.NET从零开始学习EF的增删改查

           ASP.NET从零开始学习EF的增删改查           最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...

  7. 使用EF CodeFirst 创建数据库

    EntityFramework 在VS2015添加新建项时,选择数据->ADO.NET 实体数据模型,有一下选项 来自数据库的EF设计器,这个就是我们最常用的EntityFramework设计模 ...

  8. EF上下文对象线程内唯一性与优化

    在一次请求中,即一个线程内,若是用到EF数据上下文对象,就创建一个,这也加是很多人的代码中习惯在使用上下文对象时,习惯将对象建立在using中,也是为了尽早释放上下文对象, 但是如果有一个业务逻辑调用 ...

  9. EF里Guid类型数据的自增长、时间戳和复杂类型的用法

    通过前两章Lodging和Destination类的演示,大家肯定基本了解Code First是怎么玩的了,本章继续演示一些很实用的东西.文章的开头提示下:提供的demo为了后面演示效果,前面代码有些 ...

  10. 模仿EF,我们用JS开发的HTML5 SQLite 访问库

    今天终于有空把demo放到了RunJS上面去.请使用google chrome观看在线演示: http://sandbox.runjs.cn/show/pekbd9zb 这个库本来是我们开发的phon ...

随机推荐

  1. O023、理解Nova架构

    参考https://www.cnblogs.com/CloudMan6/p/5410447.html   Compute Service Nova 是OpenStack最核心的服务,负责维护和管理云环 ...

  2. QQ恶搞 - 让艾特你的人语无伦次

    效果图: 实现过程: 代码: ‮ 将上面的代码复制添加到你的群名片后面即可. 原理解析: 这个代码是一个Unicode控制字符 - RLO,它可以控制在它后面的所有文本都已倒序的方式显示.在qq群艾特 ...

  3. idea逆向生成hibernate工程

    1.创建maven工程 2.在resources下创建hibernate.cfg.xml文件 <?xml version='1.0' encoding='utf-8'?> <!DOC ...

  4. laravel 使用 intervention/image 的注意方法

    出错NotSupportedException in AbstractEncoder.php line 151: Encodingformat (tmp) is not supported. 这个只是 ...

  5. openstack dashboard开启https

    前提条件: 1.基于http的dashboard能正常访问 2.拥有ssl证书 第一步:修改/etc/openstack-dashboard/local_settings 在DEBUG = False ...

  6. centos7搭建ntp时间同步服务器chrony服务

    centos7搭建ntp时间同步服务器chrony服务 前言: 在centos6的时候我们基本使用的是ntp服务用来做时间同步,但是在centos7后推荐是chrony作为时间同步器的服务端使用, ...

  7. 10 Zabbix4.4.1系统告警“Zabbix server is not running”

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 Zabbix4.4.1系统告警“Zabbix server is not running” 第一步 ...

  8. docker 创建容器时指定容器ip

    Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定. 在实际部署中,我们需要指定容器ip,不允许其自行分配ip,尤其是搭建集群时,固定ip是必须的. 我们可以创建自己的bri ...

  9. 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发

    ''' 写一个基于TCP协议套接字,服务端实现接收客户端的连接并发 ''' client import socket import time client = socket.socket() clie ...

  10. 【BZOJ4596】【Luogu P4336】 [SHOI2016]黑暗前的幻想乡 矩阵树定理,容斥

    同样是矩阵树定理的裸题.但是要解决它需要能够想到容斥才可以. \(20\)以内的数据范围一定要试试容斥的想法. #include <bits/stdc++.h> using namespa ...