• [Entity Framework] 学习笔记


    History

    EF最初的版本中,作为一个ORM组件其通过EDM(Entity Data Model)文件(里面是一些xml)配置数据库与实体类之间的映射,实现数据进出数据库的控制。

    最初的版本中只支持Database First,即由已有数据库结构生成EDM,继而得到实体类。

    后来EF4.0版本起开始支持Model First先建立EDM,然后生成数据库。

    4.1版本开始,EF迎来了最大的变化--开始支持Code First模式,值得注意的是Code First不是和Database FirstModel First平级的概念,而是和EDM平级的概念。

    使用Code First不再需要EDM来维护实体与数据库之间的映射关系,这个映射完全通过代码来完成,并在程序开始运行时在内存中建立一个映射模型,这也就是Code First这个名称中Code的含义。

    由于Code First的魅力极大,EDM文件又存在不利于版本管理等天生缺陷,基本上处于一个被抛弃的状态。在EF7版本可能取消EDM的支持,只保留Code First

    使用Code First一般都是先建立实体然后通过代码配置实体到数据库的映射,继而生成数据库(如果数据库已存在,就不需要再生成数据库,可以直接建立代码映射模型),这也就是所谓的Model First模式。当然Code First也支持Database First,通过工具由现有数据库生成实体,及实体映射数据库的代码。

     

    Core

     

    随着Code First一起出现的DbContextDbSet类绝对可以称得上EF的功能核心,其取代了之前的ObjectContextObjectSet类,提供了与数据库通信,管理内存中实体的重要功能。

     

    DbContext

     

    主要是负责与数据库进行通信,管理实体到数据库的映射模型,跟踪实体的更改(正如 这个类名字Context所示,其维护了一个EF内存中容器,保存所有被加载的实体并跟踪其状态)。Dbcontext中最常用的几个方法如:

     

    • SaveChanges(6.0开始增加的异步方法SaveChangesAsync):用于将实体的修改保存到数据库。
    • Set<T>:获取实体相应的DbSet对象,我们对实体的增删改查操作都是通过这个对象来进行的。

     

        还有几个次常用但很重要的属性方法:

     

    • Database属性:一个数据库对象的表示,通过其SqlQueryExecuteSqlCommand等方法可以直接执行一些Sql语句或SqlCommandEF6起可以通过Database对象控制事务。
    • Entry:获取EF Context中的实体的状态,在更改跟踪一节会讨论其作用。
    • ChangeTracker:返回一个DbChangeTracker对象,通过这个对象的Entries属性,我们可以查询EF Context中所有缓存的实体的状态。

     

    DbSet

     

        这个类的对象正是通过刚刚提到的Set<T>方法获取的对象。其中的方法都与操作实体有关,如:

     

    • Find/FindAsync:按主键获取一个实体,首先在EF Context中查找是否有被缓存过的实体,如果查找不到再去数据库查找,如果数据库中存在则缓存到EF Context并返回,否则返回null
    • Attach:将一个已存在于数据库中的对象添加到EF Context中,实体状态被标记为Unchanged。对于已有相同key的对象存在于EF Context的情况,如果这个已存在对象状态为Unchanged则不进行任何操作,否则将其状态更改为Unchanged
    • Add将一个已存在于数据库中的对象添加到EF Context中,实体状态被标记为Added。对于已有相同key的对象存在于EF Context且状态为Added则不进行任何操作。
    • Remove:将一个已存在于EF Context中的对象标记为Deleted,当SaveChanges时,这个对象对应的数据库条目被删除。注意,调用此方法需要对象已经存在于EF Context
    • Include:详见下面预加载一节。
    • AsNoTracking:相见变更跟踪一节。
    • Local属性:用来跟踪所有EF Context中状态为AddedModifiedUnchanged的实体。作用好像不是太大。没怎么用过。
    • Create:这个方法至今好像没有用到过,不知道干啥的。有了解的评论中给解释下吧。

     

     

     

    DBContext类, DbSet,

    该派生类具有一个或多个DBSet<T>类的属性,类型DBSet<T>中的每一个T代表了一个想要持久保存的对象。

    public class MusicStoreDB : DBContext
    {
        public DbSet<Album> Albums {get; set;}   
        public DbSet<Blog> Blogs {get; set;}   
    }
  • 相关阅读:
    1114: 零起点学算法21——求平均值
    1113: 零起点学算法20——输出特殊值II
    1112: 零起点学算法19——输出特殊值
    1111: 零起点学算法18——3个数比较大小
    1110: 零起点学算法17——比较2个数大小
    1109: 零起点学算法16——鸡兔同笼
    1108: 零起点学算法15——交换变量
    1107: 零起点学算法14——三位数反转
    1106: 零起点学算法13——求2个时间之间的分钟数
    设计模式之—中介者模式<Mediator Pattern>
  • 原文地址:https://www.cnblogs.com/chenyongblog/p/4900185.html
Copyright © 2020-2023  润新知