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);

}

原文地址:https://www.cnblogs.com/Dhouse/p/3568990.html