zoukankan      html  css  js  c++  java
  • EF 6.0

    最近又开始研究EF框架了 哎 搞的东西太杂了 网上的参考了一篇博客 但是他是基于EF 4.0之前做的 所以自己基于他的博客来构造EF 6.0的使用基础

    命名空间不同:

    旧版本:using System.Data.Objects;

    新版本System.Data.Entity

    入门看看就行了

    概念:

    在.Net Framework SP1微软包含一个实体框架(Entity Framework),此框架可以理解成微软的一个ORM产品。用于支持开发人员通过对概念性应用程序模型编程(而不是直接对关系存储架构编程)来创建数据访问应用程序。目标是降低面向数据的应用程序所需的代码量并减轻维护工作。

    实体框架Entity Framework 是 ADO.NET 中的一组支持开发面向数据的软件应用程序的技术。在EF中的实体数据模型(EDM)由以下三种模型和具有相应文件扩展名的映射文件进行定义。

    ·                 概念架构定义语言文件 (.csdl) -- 定义概念模型。

    ·                 存储架构定义语言文件 (.ssdl) -- 定义存储模型(又称逻辑模型)。

    ·                 映射规范语言文件 (.msl) -- 定义存储模型与概念模型之间的映射。

    实体框架 使用这些基于 XML 的模型和映射文件将对概念模型中的实体和关系的创建、读取、更新和删除操作转换为数据源中的等效操作。EDM 甚至支持将概念模型中的实体映射到数据源中的存储过程。它提供以下方式用于查询 EDM 并返回对象:

    ·                 LINQ to Entities -- 提供语言集成查询 (LINQ) 支持用于查询在概念模型中定义的实体类型。

    ·                 Entity SQL -- 与存储无关的 SQL 方言,直接使用概念模型中的实体并支持诸如继承和关系等 EDM 功能。

    ·                 查询生成器方法 --可以使用 LINQ 风格的查询方法构造 Entity SQL 查询。

     

     

    接着说说重要的类

    DBcontext 上下文容器 提供基础查询

    DBQuery 查询接口 进行复杂查询

     

    注意:上下文的操作必须放在Using里面 因为上下文是对数据库操作 必须及时释放资源

     

    LINQ TO Entities

     1.查询

                using (Entities entity = new Entities())
                {
                    DbQuery<Sys_ExamPageIndex> query = entity.Sys_ExamPageIndex;
                    IQueryable<Sys_ExamPageIndex> cust1 = from c in query select c;
                    Assert.IsNotNull(cust1);
    
                    //使用ObjectQuery类的ToTraceString()方法显示查询SQL语句
    
                    Console.Out.WriteLine(cust1.First().page_name);
    
                }

    利用Linq获得查询返回集合IQueryable

    2.条件查询

    //基于表达式的查询语法
    
        IQueryable<Customers> cust1 = from c in customers
    
                                      where c.CustomerID == "ALFKI"
    
                                      select c;
    
    //基于方法的查询语法
    
        var cust2 = edm.Customers.Where(c => c.CustomerID == "ALFKI");

    3.排序和分页

    在使用SkipTake方法实现分页时,必须先对数据进行排序,否则将会抛异常。

    //基于表达式的查询语法
    
             ObjectQuery<Customers> customers = edm.Customers;
    
             IQueryable<Customers> cust10 = (from c in customers
    
                                             orderby c.CustomerID
    
                                             select c).Skip(0).Take(10);
    
    
    //基于方法的查询语法
    
        var cust = edm.Customers.OrderBy(c => c.CustomerID).Skip(0).Take(10);

    4.聚合

    可使用的聚合运算符有AverageCountMaxMin Sum

    using (var edm = new NorthwindEntities())
    
       {
    
           var maxuprice = edm.Products.Max(p => p.UnitPrice);
    
           Console.WriteLine(maxuprice.Value);
    
     }

    5.连接

    可以的连接有Join 和 GroupJoin 方法。GroupJoin组联接等效于左外部联接,它返回第一个(左侧)数据源的每个元素(即使其他数据源中没有关联元素)。

    using (var edm = new NorthwindEntities())
    
        {
    
           var query = from d in edm.Order_Details
    
                       join order in edm.Orders
    
                       on d.OrderID equals order.OrderID
    
                       select new
    
                        {
    
                            OrderId = order.OrderID,
    
                            ProductId = d.ProductID,
    
                            UnitPrice = d.UnitPrice
    
                         };
    
            foreach (var q in query)
    
             Console.WriteLine("{0},{1},{2}",q.OrderId,q.ProductId,q.UnitPrice);
    
    }

    二、LINQ to Entities 查询注意事项

    l           排序信息丢失

    如果在排序操作之后执行了任何其他操作,则不能保证这些附加操作中会保留排序结果。这些操作包括 Select 和 Where 等。另外,采用表达式作为输入参数的 FirstFirstOrDefault 方法不保留顺序。

    如下代码:并不能达到反序排序的效果

    using (var edm = new NorthwindEntities())

    {

         IQueryable<Customers> cc = edm.Customers.OrderByDescending(c => c.CustomerID).Where(c => c.Region != null).Select(c => c);

         foreach (var c in cc)

              Console.WriteLine(c.CustomerID);

    }

    l           不支持无符号整数

    由于 实体框架不支持无符号整数,因此不支持在 LINQ to Entities 查询中指定无符号整数类型。如果指定无符号整数,则在查询表达式转换过程中会引发 NotSupportedException异常,并显示无法创建类型为“结束类型”的常量值。此上下文仅支持基元类型(“例如 Int32、String 和 Guid”)。

    如下将会报异常的代码:

    using (var edm = new NorthwindEntities())

     {

          uint id = UInt32.Parse("123");

          IQueryable<string> produt = from p in edm.Products

                                      where p.UnitPrice == id

                                      select p.ProductName;

          foreach (string name in produt)

                Console.WriteLine(name);

    }

    上面的代码中,由于id是uint而不是Int32,String,Guid的标量类型,所以在执行到where p.UnitPrice ==id这个地方时,会报异常。

    l           不支持引用非标量闭包

    不支持在查询中引用非标量闭包(如实体)。在执行这类查询时,会引发 NotSupportedException 异常,并显示消息“无法创建类型为“结束类型”的常量值。此上下文中仅支持基元类型(‘如 Int32、String 和 Guid’)

    如下将会报异常的代码:

    using (var edm = new NorthwindEntities())

     {

            Customers customer = edm.Customers.FirstOrDefault();

            IQueryable<string> cc = from c in edm.Customers

                                    where c == customer

                                    select c.ContactName;

             foreach (string name in cc)

                   Console.WriteLine(name);

    }

  • 相关阅读:
    vue computed watch 使用区别
    element 问题
    vue vue.config.js
    vue 路由
    算法
    《概率统计》10.变与不变:马尔科夫链的极限与稳态
    《概率统计》9.状态转移:初识马尔科夫链
    《概率统计》8.由静向动:随机过程导引
    《概率统计》7.统计推断:寻找最大似然与最大后验
    《概率统计》6.推断未知:统计推断的基本框架
  • 原文地址:https://www.cnblogs.com/Dhouse/p/3568990.html
Copyright © 2011-2022 走看看