zoukankan      html  css  js  c++  java
  • Entity Framework 四

    实体框架支持三种类型的查询:1)LINQ to Entities,2)Entity SQL,3)Native SQL

     LINQ方法语法:

     

    LINQ查询语法:

    实体SQL: 这种可以简单的了解,不必深入研究,知道LINQ语法或原始SQL查询就可以了。

     实体SQL是另一种创建查询的方法。它由实体框架的对象服务直接处理。它返回ObjectQuery而不是IQueryable。
      您需要ObjectContext来使用Entity SQL创建一个查询。

    原生SQL:

      

    LINQ-to-Entities查询本质就是使用了LINQ查询语法

    DbSet类

      DBSet类表示用于创建,读取,更新和删除操作的实体集当构建时不知道实体的类型时,可以使用DBSet(DbSet <TEntity>)的通用版本。

    您可以通过使用DBContext获取DBSet的引用,例如。dbcontext.Students等。DbContext类包括DbSet,如下所示:

    DBSet类的一些重要方法:

     

     

    访问MSND获取有关DBSet类的更多信息

     DBEntityEntry类

       DBEntityEntry是一个重要的类,在检索有关实体的各种信息时非常有用。您可以使用DBContext的Entry方法获取特定实体的DBEntityEntry实例。例如: 

       

    DBEntityEntry使您可以访问给定实体的所有属性的实体状态,当前值和原始值。以下示例代码显示如何检索特定实体的重要信息。

    DbEntityEntry使您能够将实体状态添加,修改或删除,如下所示。

     

     DBEntityEntry类具有以下重要的方法:

     

     

    有关DBEntityEntry类的更多信息,访问MSDN 

     在实体框架中更改跟踪:

    实体框架支持在上下文的生命周期中加载实体的自动更改跟踪。DbChangeTracker类为您提供有关当前正在被上下文跟踪的实体的所有信息

    请注意,每个实体必须具有EntityKey(主键)属性才能被上下文跟踪实体框架不会在没有EntityKey属性的概念模型中添加任何实体

    例如:

       static void Main(string[] args)
            {
                using (var ctx = new SchoolDBEntities())
                {
                    Console.WriteLine("查找");
                    var student = ctx.Students.Find(1);
                    Console.WriteLine("{0}个实体上下文跟踪情况", ctx.ChangeTracker.Entries().Count());
                    DisplayTrackedEntities(ctx.ChangeTracker);
                    Console.WriteLine("查找");
                    var student1 = ctx.Standards.Find(1);
                    Console.WriteLine("{0}个实体上下文跟踪情况", ctx.ChangeTracker.Entries().Count());
                    Console.WriteLine("编辑");
                    student1.StandardName = "编辑名称";
                    DisplayTrackedEntities(ctx.ChangeTracker);
                    Teacher teacher = new Teacher() { TeacherName = "新老师" };
                    Console.WriteLine("添加老师");
                    ctx.Teachers.Add(teacher);
                    Console.WriteLine("{0}个实体上下文跟踪情况", ctx.ChangeTracker.Entries().Count());
                    DisplayTrackedEntities(ctx.ChangeTracker);
                    Console.WriteLine("删除学生");
                    ctx.Students.Remove(student);
                    DisplayTrackedEntities(ctx.ChangeTracker);
                }
            }
    
            private static void DisplayTrackedEntities(DbChangeTracker changeTracker)
            {
                Console.WriteLine("");
                var entries = changeTracker.Entries();
                foreach (var item in entries)
                {
                    Console.WriteLine("实体名称:{0}", item.Entity.GetType().FullName);
                    Console.WriteLine("状态:{0}", item.State);
                }
                Console.WriteLine("");
                Console.WriteLine("----------------------------");
            }

     每当我们检索,添加,修改或删除任何实体时,上下文都会跟踪实体请注意,在实体的任何操作过程中,上下文都处于活动状态如果您对范围外的实体进行任何操作,则上下文不会跟踪。

     持久化一个实体框架

       使用EntityFramework,连接和断开连接的场景来持久化一个实体有两种情况。

      连接场景:这是当从数据库中检索实体并在相同的上下文中使用persist时。Context对象不会在实体的实体检索和持久化之间破坏。

         

     断开连接的场景:断开的连接场景是从数据库中检索实体,并使用上下文中的不同对象提交更改的实体。以下示例说明了断开的情况:

       

    根据上述情况,Context1用于读取操作,然后Context1被销毁。一旦实体发生变化,应用程序使用Context2提交实体 - 一个不同的上下文对象。

    断开的情况是复杂的,因为新的上下文不知道修改的实体的任何内容,所以你将不得不指示实体中已经改变的上下文。在下图中,应用程序使用上下文1检索实体图,然后应用程序对其执行一些CUD(创建,更新,删除)操作,最后使用上下文2保存实体图。上下文2不知道什么在这种情况下,已经在实体图上执行了操作。

     

  • 相关阅读:
    利用qq设置个性化的域名邮箱
    中小企业为什么要上HR系统
    JAVA设计模式之:命令模式
    hdoj 1251 统计难题 【字典树】
    哈希表(散列)HashTable实现
    HDU 1711 Number Sequence(字符串匹配)
    回溯法之求n个集合的幂集
    微软Azure云计算服务主导全球
    jQuery选择器
    MyEclipse激活步骤
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/7831355.html
Copyright © 2011-2022 走看看