• EF中的上下文(DbContext)简介


    DbContext是实体类和数据库之间的桥梁,DbContext主要负责与数据交互,主要作用:

    1、DbContext包含所有的实体映射到数据库表的实体集(DbSet < TEntity >)。

    2、DbContext 将LINQ-to-Entities查询转换为SQL查询并将其发送到数据库。

    3、更改跟踪: 它跟踪每个实体从数据库中查询出来后发生的修改变化。

    4、持久化数据: 它也基于实体状态执行插入、更新和删除操作到数据库中。

    DbContext中的DbSet

    DbSet表示上下文中指定类型的所有实体的集合或可从数据库中查询的指定类型的所有实体的集合。

    DbSet常用方法

    TestDBContext tdb = new TestDBContext();

    Add(Entity)/AddRange

    return添加

    的Entity

    添加实体到context中,并给实体标记Added状态

    tdb.Persons.Add(entityModel);

     AsNoTracking<Entity>   

    获取一个不被context缓冲和追踪的序列,多用于只读序列

    var personList = tdb.Persons.AsNoTracking<Person>().ToList<Person>();

     Attach(Entity)

    return添加

    的Entity

     将实体添加到context上下文中

    tdb.Persons.Attach(entityModel);

     Find(int)

    return对应id

    的Entity

    通过主键获取实体对象,如果在数据库和context中不存在那么返回null,注:会返回在context中存在但还没写入数据库的实体对象

    Person personEntity = tdb.Persons.Find(1);

     Include  

     include必须是外键连接,且立即执行;join连接不需要外键,延时执行

    var personList = tdb.Persons.Include("PersonName").ToList<Person>();

    var personList= tdb.Persons.Include(s => s.PersonName).ToList<Person>();

     Remove/RemoveRange

    retrun删除

    的entity

    删除实例,并给实例对象添加deleted标记

    tdb.Persons.Remove(EntityModel);

     SqlQuery  

     通过sql获取实例集合,默认返回的集合是被追踪的,可以使用AsNoTracking()取消追踪

    var personEntity = tdb.Persons.SqlQuery("select * from T_Person where id = 1").FirstOrDefault<Person>();


     

    在EF中实体的五种状态:

    1.detached:实体不在上下文的追踪范围内,如刚new的实体,可以通过Attach()添加到上下文,此时状态为unchanged。

    2.unchanged:未改变,如刚从数据库读取出来的实体。

    3.added:添加状态,一般执行Add/AddRange时标记为added。因为新对象在数据库中没有记录,所以不能转为deleted和modified状态。

    4.deleted:删除状态,一般执行Remove/RemoveRange时标记为deleted,不能转换为added状态。

    5.modified:修改状态,改变了实体的属性会处于这个状态,能转为deleted状态,不能转换为added状态。

    EF如何判断状态

    为当前对象(需要追踪的)创建一个DbEntityEntry对象,此对象包含:

    Current Value(当前值)/Original Value(原始值)/Database Value(数据库里的值)

    只需要比较这三个值,很容易就知道哪些属性被修改了。

    设置context.Configuration.AutoDetectChangesEnabled = false则不会去追踪,默认是true。

    也可以自己指定状态:

  • 相关阅读:
    INFORMIX体系效能改善第一步
    Ubuntu判袂率不正常的一种复杂治理措施
    ubuntu8.04分区分配方案
    计算机启动更快的十五招
    理顺 JavaScript (13) 对象及 json
    获取指定地址的 JPG 图片 回复 "bangrj" 的问题
    理顺 JavaScript (14) constructor 与 instanceof
    理顺 JavaScript (9) Date 类
    用 API 提取、写入指定网站的 Cookie 回复 "bangrj" 的问题
    理顺 JavaScript (10) Math 类
  • 原文地址:https://www.cnblogs.com/linybo/p/13260267.html
Copyright © 2020-2023  润新知