• EntityFrameWork简单使用介绍


    本篇是练习完微软官方例子后,对EntityFramework的总结。如果你是新手建议看下微软官方例子Getting Started with Entity Framework 6 Code First using MVC 5

    CodeFirst

    CodeFirst就是开发中,先不考虑数据库,直接根据领域模型建造业务实体,在通过持久将实体保存到数据库。利用EntityFramework可用很方便的实现CodeFirst。步骤如下

    1. 按照ef install-packages -entityframework
    2. 新建Model实体
    3. 实现DbContext作为当前数据上下文并配置文件webconfig添加connectionstrings,如果有多个类实现DbContext使用时需指明,(如果connectionstringskey值同数据上下文类名相同则会自动关联数据库,如不同重写构造函数)
    4. build,应用数据迁移enable-migrations可选参数ContextTypeName用于指明数据上下文类,运行会生成文件夹Migrations,可用定义填充数据
    5. add-migration 自定起名(最好具有对数据库更改有描述性)生成Model的修改对database的操作语句
    6. update-database将更新同步到数据库 在开发中对database多次修改可反复用 5-6

    实体间的关系的生成

    一些实体是相互关联的,那么怎么体现在Model和database上的呢?

    • 一对一:一个课程Course只属于一个办公室Department``Department的外键约束
    public class Course
    {
        public int DepartmentID { get; set; }
        public virtual Department Department { get; set; }
    }
    

    注意:反映在数据库表CourdeDepartmentID

    • 一对多:一个Department可有多个课程Course,则反映在导航属性上
    public class Department
    {
        public virtual ICollection<Course> Courses { get; set; }
    }
    

    Reading

    通过ef从database读取数据,DbSet<Student>实现了IQueryable<>,可以通过Linq或Lambda表达式查询,单实体查询:

    private SchoolContext db = new SchoolContext();
    var students = from s in db.Students
    						   select s;
    

    对包括关联其他Model的属性的查询

    • Lazy loading 当访问到属性字段时才发送sql,查询:

    • Eager loading 渴望加载,通过一条sql语句,将关联属性也查出,反映到sql时join语句

    注意可查看sql语句:departments.ToString();
    注意 这里通过include一次加载数据,关于include这里说点:如果一个实体的属性还包含实体怎么办?
    这里分情况看关联到的属性是个是集合:
    第一层是集合:query.Include(e => e.Level1Collection),
    两层非集合 query.Include(e => e.Level1Reference.Level2Reference),
    两层集合query.Include(e => e.Level1Collection.Select(l1 => l1.Level2Reference))

    • Explicite Loading 同Lazy loading当属性访问时loading data。但需要手动指定。当Lazy Loading关闭时使用,Lazy Loading当序列化时会加载关联属性可能消耗比较大。

    数据保存

    在添加或删除都是通过SaveChanges保存到数据库

    • 单实体添加数据 db.Students.Add(student); db.SaveChanges();
    • 删除单个实体: db.Students.Remove(student); db.SaveChanges();
    • 更新:先通过ef查询到实体,修改数据再SaveChanges,当有关联属性时直接修改其值,添加关联集合通过add,删除通过remove 最后SaveChanges.
  • 相关阅读:
    利用快慢指针快速得到链表中间节点
    idea编译golang插件总结
    Jquery复习(二)之stop()易忘点
    Jquery复习(一)之animate()易忘点
    doT学习(三)之实战
    doT学习(二)之用法集合
    doT学习(一)之语法
    npm学习(十二)之高级用法
    npm学习(十一)之package-lock.json
    npm学习(十)之如何使用创建、发布、使用作用域包
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/9647648.html
Copyright © 2020-2023  润新知