zoukankan      html  css  js  c++  java
  • 如何使用EF?

    方法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 = "19861112";
                user.ID = 4;   
                
                //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 == 4
                           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 == 4);       
    
            //查询部分列
            var data1 = dbcontext.USERS.Where(u => u.ID == 4).Select(u=>u.ID);
            var data2 = dbcontext.USERS.Where(u => u.ID == 4).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 > 0).OrderBy<USERS, int>(u => u.ID);
                //int <==> ID  根据ID来排序,所以在OrderBy后面的泛型约束中TKey 使用int(因为ID是int类型的)
                var pageData1 = dbcontext.USERS.Where(u => u.ID > 0).OrderBy<USERS, string>(u => u.NAME);
    
                //在实际使用中,可以将orderBy后面的泛型约束给省略掉:
                var pageData2 = dbcontext.USERS
                    .Where(u => u.ID > .0)
                    .OrderBy(u => u.NAME)
                    // 每页5条,要取第三页的数据。从第10条数据开始取5条数据
                    .Skip(5*(3-1))//越过多少条数据呢? 越过前2页的数据
                    .Take(5);//取5条
    
                //使用查询语法做分页 
                var pageData3 = (from u in dbcontext.USERS
                                 where u.ID > 0
                                 orderby u.ID descending
                                 select u).Skip(10).Take(5);
                //还是要用到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、不在数据端额外的消耗性能

  • 相关阅读:
    宾得镜头资料
    先感动自己才能感动别人
    关于单反相机中的APSC
    K10D和凤凰镜头
    Vista的新快捷键
    微软雅黑字体“演”字变“漠”字的bug
    Windows XP无线零配置服务
    剑走偏锋,用XP的启动管理来搞定Vista、XP双系统
    BCB中的目录选择对话框的实现
    MagicAjax 使用
  • 原文地址:https://www.cnblogs.com/vichin/p/7749961.html
Copyright © 2011-2022 走看看